MCDBA Brasil


  • Home
  • Sobre
  • Contato

Livros





Links Rápidos

SQL Server Builds (All Versions/Editions)


Download SQL Server 2017 (trial)


SQL Server 2017 Feature Pack


SQL Server 2016 Feature Pack


Cumulative Update SQL Server 2017 builds


Cumulative Update SQL Server 2016 builds


Cumulative Update SQL Server 2014 builds


Cumulative Update SQL Server 2012 builds


SQL Server 2005/2008 Samples Databases


Documentando o Servidor SQL Server


Analisando a Performance do Servidor-CheckList


Virtual PASS PT


Faça parte do maior virtual chapter do PASS com conteúdos técnicos em Português sobre SQL Server.

Todos os meses um evento Online para você! Acompanhe aqui os WebCasts já agendados

Sindicalize seu blog ou site ao VirtualPASSPT

SQL Server Blogs

SQL Server Query Processing Team


SQL Programmability & API Development Team


SQL Server Manageability Team


Latin America Support Team


Database + Disk + Performance


Microsoft SQL Server Support


SQL CLR Team


SQL Query Optimization Team


SQL 2005 Code Samples


SQL Server Express Team


SQL SMO Samples


SQL Storage Engine Team


SQL CAT Team


SQL Protocols Team


PSS SQL Server Engineers


Slava Oks on SQLOS


Ken Henderson’s blog


LUTI@Microsoft Blog


kimberly L. Trip’s blog


Fernando Garcia Blog

Dica da Semana

Numerando as linhas do SELECT Dinamicamente

por Nilton Pinheiro janeiro 30, 2006 Nenhum comentário

No SQL Server 2000, sempre que precisamos numerar os registros resultantes de um SELECT de forma dinâmica, as sugestôes normalmente são baseadas em loops e tabelas temporárias. Para a nossa felicidade, o SQL Server 2005 vem com uma função chamada ROW_NUMBER() a qual nos permite realizar esta operação de forma bem mais simples. No exemplo abaixo, podemos ver como esta função pode ser utilizada.

USE AdventureWorks
GO
SELECT  ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS ‘Row Number’,
c.FirstName, c.LastName,a.PostalCode
FROM Sales.SalesPerson s
JOIN Person.Contact c on s.SalesPersonID = c.ContactID
JOIN Person.Address a ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0


Row Number FirstName   LastName    PostalCode
———- ———– ———– ———-
1          Shelley     Dyck        98027
2          Gail        Erickson    98055
3          Maciej      Dusza       98027
4          Linda       Ecoffey     98027
5          Mark        Erickson    98055
6          Terry       Eminhizer   98055
7          Michael     Emanuel     98055
8          Jauna       Elson       98055
9          Carol       Elliott     98027
10         Janeth      Esteves     98055
11         Martha      Espinoza    98055
12         Carla       Eldridge    98027
13         Twanna      Evans       98055


A dica desta semana mostra como podemos obter este resultado no SQL Server 2000 sem precisar usar loops ou tabelas temporárias. A técnica é baseada em JOINS, o qual inclusive tende a ser bem mais performática que as soluções tradicionais.


No primeiro exemplo, utilizamos um INNER JOIN da tabela pubs..authors com ela mesma e contamos o número de vezes que o relacionamento “é maior igual que” é satisfeito, agrupando por lastname e firstname.


SELECT rank=count(*), a1.au_lname, a1.au_fname
FROM authors a1 INNER JOIN authors a2
ON a1.au_lname >= a2.au_lname
GROUP BY a1.au_lname, a1.au_fname
ORDER BY 1


rank        au_lname         au_fname
———– —————- ———
1           Bennet           Abraham
2           Blotchet-Halls   Reginald
3           Carson           Cheryl
4           DeFrance         Michel
5           del Castillo     Innes
6           Dull             Ann
7           Green            Marjorie
.
.
.
(23 row(s) affected)


No segundo exemplo, utilizamos tabelas derivadas para obter as lojas com seus respectivos números de livros vendidos. O relacionamento é baseados no número de livros vendidos “é maior igual que”.


SELECT rank=count(*), s1.stor_id, qty=sum(s1.qty)
FROM (SELECT stor_id, qty=sum(qty) FROM sales GROUP BY stor_id) s1,
     (SELECT stor_id, qty=sum(qty) FROM sales GROUP BY stor_id) s2
WHERE s1.qty >= s2.qty
GROUP BY s1.stor_id
ORDER BY 1


rank    stor_id qty
——- ——- —-
1 6380    8
2 7896    120
3 8042    240
4 7067    360
5 7066    625
6 7131    780


(6 row(s) affected)


Mais informações e exemplos sobr a utilização dessa técnica podem ser vistos no artigo KB 186133: How to dynamically number rows in a SELECT Transact-SQL statement

Avaliação:
Compartilhe:
  • Anterior RunScript 2.1 Update20 anos atrás
  • Próximo Otimizando performance com Filegroups20 anos atrás

Deixe uma resposta Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

MVP Reconnect Award

Categorias

  • Artigos (359)
  • Dica da Semana (95)
  • Documentação (54)
  • Downloads (113)
  • MSDE 2000 (3)
  • Sem categoria (1)
  • Tutoriais (9)

Posts recentes

  • #FechouBrasil #PartiuPortugal
  • Brigando com o erro “The cached MSI file is missing”
  • MCDBABRASIL está de volta
  • Documentando o Servidor SQL Server
  • Brigando com os Erros 17182, 17826 e 17120

SQL Server AlwaysOn Video Series

Video1: Introdução ao SQLServer2012 AlwaysOn


Video2: Introdução ao SQLServer2012 AlwaysOn Availability Group


Video3: Introdução ao SQLServer2012 AlwaysOn AVG-Demo


Video4: Introdução ao SQLServer2012 AlwaysOn Listener


Video5: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries


Video6: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries-Demo


Video7: Introdução ao SQLServer2012 AlwaysOn Failover Clustering


Serie SQL Server Failover Clustering End-to-End

Parte 1: Configuração da Rede e Ambiente


Parte 2: Configurando o Windows 2008 R2 Domain Controler e DNS


Parte 3: Preparando os nós para o Failover Cluster


Parte 4: Configurando um Failover Cluster de 2 nós


Parte 5: Configurando as LUNs no iSCSI Software Target (Parte 1)


Parte 6: Configurando as LUNs no iSCSI Software Target (Parte 2)


Parte 7: Apresentando as LUNs para os nós do Failover Cluster


Parte 8: Configurando os discos no Failover Cluster


Parte 9: Instalando a primeira instância virtual do SQL Server 2008


Parte 10: Instalando a segunda instância virtual do SQL Server 2008


Parte 11: Instalando e Configurando o MSDTC no Failover Cluster


Parte 12: Configurando Mount Points no Cluster e SQL Server 2008


Vídeo Extra: Removendo uma Instância do SQL Server 2008 R2 em Cluster


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering Overview


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering na Prática

Menu

  • Home
  • Sobre
  • Contato

Mais

  • RSS Feeds
2026 MCDBA Brasil.