RANK fornece a classificação na partição ordenada. Os empates recebem a mesma classificação, com o (s) próximo (s) ranking (s) ignorado (s). Portanto, se você tiver 3 itens na classificação 2, a próxima classificação listada será classificada como 5.
DENSE_RANK novamente fornece a classificação na partição ordenada, mas as classificações são consecutivas. Nenhuma classificação será ignorada se houver classificações com vários itens.
Quanto aos nulos, isso depende da cláusula ORDER BY. Aqui está um script de teste simples com o qual você pode jogar para ver o que acontece:
with q as(select10 deptno,'rrr' empname,10000.00 sal from dual unionallselect11,'nnn',20000.00from dual unionallselect11,'mmm',5000.00from dual unionallselect12,'kkk',30000from dual unionallselect10,'fff',40000from dual unionallselect10,'ddd',40000from dual unionallselect10,'bbb',50000from dual unionallselect10,'xxx',nullfrom dual unionallselect10,'ccc',50000from dual)select empname, deptno, sal, rank()over(partitionby deptno orderby sal nulls first) r, dense_rank()over(partitionby deptno orderby sal nulls first) dr1, dense_rank()over(partitionby deptno orderby sal nulls last) dr2from q;
EMP DEPTNO SAL R DR1 DR2--- ---------- ---------- ---------- ---------- ----------
xxx 10114
rrr 1010000221
fff 1040000332
ddd 1040000332
ccc 1050000543
bbb 1050000543
mmm 115000111
nnn 1120000222
kkk 12300001119rows selected.
muito boa idéia usar select união todos da dupla para gerar dados amostra sem criar qualquer tabela
Jean-Christophe Blanchard
@ Jean-ChristopheBlanchard, embora você possa usar com facilidade uma valuescláusula.
Curinga
1
@Wildcard No PG, sim. No Oracle, não . Pelo menos não a partir de 11. Ainda não encontrei 12 em prod.
Jpmc26
Remova from dualpara gerar esses dados em Redshift
Gaurav
4
Ivan, RANK, me dá uma idéia de onde estou em relação a todos aqueles à minha frente. DENSE_RANK me diz a classificação absoluta. Posso ter o segundo salário mais alto, mas pode haver 100 pessoas à minha frente. Qual é o melhor depende da pergunta que estou respondendo.
+---+------------+------+------------+| V | ROW_NUMBER | RANK | DENSE_RANK |+---+------------+------+------------+| a |1|1|1|| a |2|1|1|| a |3|1|1|| b |4|4|2|| c |5|5|3|| c |6|5|3|| d |7|7|4|| e |8|8|5|+---+------------+------+------------+
Em palavras
ROW_NUMBER() atribui um valor exclusivo a cada linha
RANK() atribui o mesmo número de linha ao mesmo valor, deixando "buracos"
DENSE_RANK() atribui o mesmo número de linha ao mesmo valor, não deixando "buracos"
+--------+------+------+| ENAME | SAL | RANK |+--------+------+------+| SMITH |800|1|| JAMES |950|2|| ADAMS |1100|3|| MARTIN |1250|4|| WARD |1250|4|| TURNER |1500|6|+--------+------+------+
+--------+------+-----------+| ENAME | SAL | DEN_RANK |+--------+------+-----------+| SMITH |800|1|| JAMES |950|2|| ADAMS |1100|3|| MARTIN |1250|4|| WARD |1250|4|| TURNER |1500|5|+--------+------+-----------+
A única diferença entre as funções RANK () e DENSE_RANK () ocorre nos casos em que há um "empate"; ou seja, nos casos em que vários valores em um conjunto têm a mesma classificação. Nesses casos, RANK () atribuirá "classificações" não consecutivas aos valores do conjunto (resultando em intervalos entre os valores de classificação inteira quando houver um empate), enquanto DENSE_RANK () atribuirá classificações consecutivas aos valores no conjunto. definido (portanto, não haverá lacunas entre os valores de classificação inteira no caso de empate).
Por exemplo, considere o conjunto {25, 25, 50, 75, 75, 100}. Para esse conjunto, RANK () retornará {1, 1, 3, 4, 4, 6} (observe que os valores 2 e 5 são ignorados), enquanto DENSE_RANK () retornará {1,1,2,3, 3,4}.
A função Rank () SQL gera a classificação dos dados dentro do conjunto ordenado de valores, mas a próxima classificação após a classificação anterior é o número da linha dessa linha específica. Por outro lado, a função SQL Dense_Rank () gera o próximo número em vez de gerar o número da linha. Abaixo está o exemplo do SQL que esclarecerá o conceito:
Rank(), Dense_rank(), row_number()
Todas essas são funções de janela, o que significa que agem como janela sobre algumas entradas ordenadas definidas no início. Essas janelas têm funcionalidades diferentes anexadas, com base no requisito. Aqui está o acima 3:
row_number()
Começando por row_number()isso, forma a base dessas funções de janela relacionadas. row_number()como o nome sugere, fornece um número exclusivo para o conjunto de linhas sobre as quais foi aplicado. É semelhante a atribuir um número de série a cada linha.
Rank()
Uma subversão de row_number()pode ser dita como rank(). Rank () é usado para atribuir o mesmo número de série às linhas de conjunto ordenadas que são duplicadas, mas ainda mantém a contagem mantida como semelhante a row_number()para todos aqueles depois de duplicatas, o que significa abaixo, por exemplo. Para os dados 2 row_number () = rank (), o que significa que ambos diferem apenas na forma de duplicatas.
Data row_number() rank() dense_rank()1111121113112442
Finalmente,
Dense_rank () é uma versão estendida de rank (), pois o nome sugere sua densidade, porque, como você pode ver no exemplo acima, rank () = dense_rank () para todos os dados 1, mas apenas para os dados 2, ele difere na forma em que mantém a ordem da classificação () da classificação anterior () e não os dados reais
A única diferença entre as funções RANK () e DENSE_RANK () ocorre nos casos em que há um "empate"; ou seja, nos casos em que vários valores em um conjunto têm a mesma classificação. Nesses casos, RANK () atribuirá "classificações" não consecutivas aos valores do conjunto (resultando em intervalos entre os valores de classificação inteira quando houver um empate), enquanto DENSE_RANK () atribuirá classificações consecutivas aos valores no conjunto. definido (portanto, não haverá lacunas entre os valores de classificação inteira no caso de empate).
Por exemplo, considere o conjunto {30, 30, 50, 75, 75, 100}. Para esse conjunto, RANK () retornará {1, 1, 3, 4, 4, 6} (observe que os valores 2 e 5 são ignorados), enquanto DENSE_RANK () retornará {1,1,2,3, 3,4}.
values
cláusula.from dual
para gerar esses dados em RedshiftEste artigo aqui explica bem. Essencialmente, você pode olhar para isso da seguinte forma:
O acima irá render:
Em palavras
ROW_NUMBER()
atribui um valor exclusivo a cada linhaRANK()
atribui o mesmo número de linha ao mesmo valor, deixando "buracos"DENSE_RANK()
atribui o mesmo número de linha ao mesmo valor, não deixando "buracos"fonte
fonte
rank () : é usado para classificar um registro dentro de um grupo de linhas.
dense_rank () : A função DENSE_RANK atua como a função RANK, exceto pelo fato de atribuir classificações consecutivas.
Inquerir -
Resultado -
Inquerir -
Resultado -
fonte
Row_number()
-> Usado para gerar número de sérieDense_rank()
dará classificação contínua, mas a classificação pulará a classificação em caso de conflito de classificação.fonte
A única diferença entre as funções RANK () e DENSE_RANK () ocorre nos casos em que há um "empate"; ou seja, nos casos em que vários valores em um conjunto têm a mesma classificação. Nesses casos, RANK () atribuirá "classificações" não consecutivas aos valores do conjunto (resultando em intervalos entre os valores de classificação inteira quando houver um empate), enquanto DENSE_RANK () atribuirá classificações consecutivas aos valores no conjunto. definido (portanto, não haverá lacunas entre os valores de classificação inteira no caso de empate).
Por exemplo, considere o conjunto {25, 25, 50, 75, 75, 100}. Para esse conjunto, RANK () retornará {1, 1, 3, 4, 4, 6} (observe que os valores 2 e 5 são ignorados), enquanto DENSE_RANK () retornará {1,1,2,3, 3,4}.
fonte
A função Rank () SQL gera a classificação dos dados dentro do conjunto ordenado de valores, mas a próxima classificação após a classificação anterior é o número da linha dessa linha específica. Por outro lado, a função SQL Dense_Rank () gera o próximo número em vez de gerar o número da linha. Abaixo está o exemplo do SQL que esclarecerá o conceito:
Ele irá gerar a seguinte saída:
fonte
Classificação e classificação densa fornecem a classificação no conjunto de dados particionado.
Rank (): não fornece números inteiros consecutivos.
Dense_rank (): fornece números inteiros consecutivos.
Na figura acima, a classificação de 10008 zip é 2 pela função dense_rank () e 24 pela função rank (), pois considera o número da linha.
fonte
Rank(), Dense_rank(), row_number()
Todas essas são funções de janela, o que significa que agem como janela sobre algumas entradas ordenadas definidas no início. Essas janelas têm funcionalidades diferentes anexadas, com base no requisito. Aqui está o acima 3:row_number()
Começando por
row_number()
isso, forma a base dessas funções de janela relacionadas.row_number()
como o nome sugere, fornece um número exclusivo para o conjunto de linhas sobre as quais foi aplicado. É semelhante a atribuir um número de série a cada linha.Rank()
Uma subversão de
row_number()
pode ser dita comorank()
. Rank () é usado para atribuir o mesmo número de série às linhas de conjunto ordenadas que são duplicadas, mas ainda mantém a contagem mantida como semelhante arow_number()
para todos aqueles depois de duplicatas, o que significa abaixo, por exemplo. Para os dados 2 row_number () = rank (), o que significa que ambos diferem apenas na forma de duplicatas.Finalmente,
Dense_rank () é uma versão estendida de rank (), pois o nome sugere sua densidade, porque, como você pode ver no exemplo acima, rank () = dense_rank () para todos os dados 1, mas apenas para os dados 2, ele difere na forma em que mantém a ordem da classificação () da classificação anterior () e não os dados reais
fonte
A única diferença entre as funções RANK () e DENSE_RANK () ocorre nos casos em que há um "empate"; ou seja, nos casos em que vários valores em um conjunto têm a mesma classificação. Nesses casos, RANK () atribuirá "classificações" não consecutivas aos valores do conjunto (resultando em intervalos entre os valores de classificação inteira quando houver um empate), enquanto DENSE_RANK () atribuirá classificações consecutivas aos valores no conjunto. definido (portanto, não haverá lacunas entre os valores de classificação inteira no caso de empate).
Por exemplo, considere o conjunto {30, 30, 50, 75, 75, 100}. Para esse conjunto, RANK () retornará {1, 1, 3, 4, 4, 6} (observe que os valores 2 e 5 são ignorados), enquanto DENSE_RANK () retornará {1,1,2,3, 3,4}.
fonte