Você verá a diferença apenas se tiver vínculos em uma partição para um valor de pedido específico.
RANK
e DENSE_RANK
são determinísticos nesse caso, todas as linhas com o mesmo valor para as colunas de ordenação e particionamento terão um resultado igual, enquanto ROW_NUMBER
arbitrariamente (não deterministicamente) atribuirão um resultado incremental às linhas vinculadas.
Exemplo: (Todas as linhas têm o mesmo, StyleID
portanto, estão na mesma partição e nessa partição as 3 primeiras linhas são vinculadas quando ordenadas por ID
)
WITH T(StyleID, ID)
AS (SELECT 1,1 UNION ALL
SELECT 1,1 UNION ALL
SELECT 1,1 UNION ALL
SELECT 1,2)
SELECT *,
RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'RANK',
ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS 'ROW_NUMBER',
DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'DENSE_RANK'
FROM T
Devoluções
StyleID ID RANK ROW_NUMBER DENSE_RANK
----------- -------- --------- --------------- ----------
1 1 1 1 1
1 1 1 2 1
1 1 1 3 1
1 2 4 4 2
Você pode ver que, para as três linhas idênticas, os ROW_NUMBER
incrementos, o RANK
valor permanece o mesmo e então passa para 4
. DENSE_RANK
também atribui a mesma classificação a todas as três linhas, mas o próximo valor distinto recebe um valor 2.
Este artigo aborda uma relação interessante entre
ROW_NUMBER()
eDENSE_RANK()
(aRANK()
função não é tratada especificamente). Quando você precisar gerarROW_NUMBER()
umaSELECT DISTINCT
declaração,ROW_NUMBER()
ela produzirá valores distintos antes de serem removidos pelaDISTINCT
palavra - chave. Por exemplo, esta consulta... pode produzir este resultado (
DISTINCT
não tem efeito):Considerando que esta consulta:
... produz o que você provavelmente deseja neste caso:
Observe que a
ORDER BY
cláusula daDENSE_RANK()
função precisará de todas as outras colunas daSELECT DISTINCT
cláusula para funcionar corretamente.A razão para isso é que, logicamente, as funções da janela são calculadas antes de
DISTINCT
serem aplicadas .Todas as três funções em comparação
Usando a sintaxe padrão do PostgreSQL / Sybase / SQL (
WINDOW
cláusula):... você terá:
fonte
Bastante:
A classificação de uma linha é uma mais o número de classificações que vêm antes da linha em questão.
Row_number é a classificação distinta de linhas, sem nenhuma lacuna na classificação.
http://www.bidn.com/blogs/marcoadf/bidn-blog/379/ranking-functions-row_number-vs-rank-vs-dense_rank-vs-ntile
fonte
Consulta simples sem cláusula de partição:
Resultado:
fonte
Veja este exemplo.
Inserir alguns dados
Repita os mesmos valores para 1
Look All
Veja seus resultados
Precisa entender os diferentes
fonte
Além disso, preste atenção a ORDER BY em PARTITION (o Standard AdventureWorks db é usado, por exemplo) ao usar RANK.
Dá resultado:
SalesOrderID SalesOrderDetailID rank_same_as_partition rank_salesorderdetailid43659 1 1 1
43659 2 1 2
43659 3 1 3
43659 4 1 4
43659 5 1 5
43659 6 1 6
43659 7 1 7
43659 8 1 8
43659 9 1 9
43659 10 1 10
43659 11 1 11
43659 1 12
Mas se alterar a ordem por para (use OrderQty:
Dá:
SalesOrderID OrderQty rank_salesorderid rank_orderqty43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 2 1 7
43659 2 1 7
43659 3 1 9
43659 3 1 9
43659 4 1 11
43659 6 1 12
Observe como a classificação muda quando usamos OrderQty (segunda tabela da coluna da direita) em ORDER BY e como ela muda quando usamos SalesOrderDetailID (primeira tabela da coluna da direita) em ORDER BY.
fonte
Não fiz nada com classificação, mas descobri isso hoje com row_number ().
Isso resultará em alguns números de linha repetidos, pois no meu caso, cada nome contém todos os itens. Cada item será encomendado por quantos foram vendidos.
fonte