Categorias:

Funções de janela (Relacionada à classificação, Quadro de janela)

DENSE_RANK

Retorna a posição de um valor dentro de um grupo de valores sem lacunas nas classificações.

O valor da classificação começa em 1 e continua em sequência.

Se dois valores são os mesmos, eles têm a mesma classificação.

Sintaxe

DENSE_RANK() OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ ASC | DESC ] [ <window_frame> ] )
Copy

Para obter mais detalhes sobre a sintaxe window_frame, consulte Sintaxe e utilização do quadro de janela.

Argumentos

Nenhum.

A função em si não aceita argumentos porque retorna a classificação (posição relativa) da linha atual dentro da janela, que é ordenada por <expr2>. A ordenação da janela determina a classificação, portanto não há necessidade de passar um parâmetro adicional para a função RANK.

Notas de uso

  • expr1 A coluna ou expressão para divisão da janela.

    Por exemplo, suponha que dentro de cada estado ou província, você queira classificar os agricultores em ordem pela quantidade de milho que eles produziram. Neste caso, você divide por estado.

    Se você quiser apenas um único grupo (por exemplo, você quer classificar todos os agricultores nos EUA independentemente do estado em que eles vivem), então omita a cláusula PARTITION BY.

  • expr2 A coluna ou expressão para ordenação (classificação).

    Por exemplo, se você estiver classificando os agricultores para ver quem produziu mais milho (dentro de seu estado), então você usaria a coluna bushels_produced. Para obter mais detalhes, consulte Exemplos (neste tópico).

  • Os valores de empate resultam no mesmo valor de classificação, mas ao contrário do RANK, eles não resultam em lacunas na sequência.

Exemplos

Criar uma tabela e dados:

-- Create table and load data.
create or replace table corn_production (farmer_ID INTEGER, state varchar, bushels float);
insert into corn_production (farmer_ID, state, bushels) values
    (1, 'Iowa', 100),
    (2, 'Iowa', 110),
    (3, 'Kansas', 120),
    (4, 'Kansas', 130);
Copy

Mostrar a produção de milho dos agricultores em ordem decrescente, juntamente com a classificação da produção de cada agricultor individual (maior = 1):

SELECT state, bushels,
        RANK() OVER (ORDER BY bushels DESC),
        DENSE_RANK() OVER (ORDER BY bushels DESC)
    FROM corn_production;
+--------+---------+-------------------------------------+-------------------------------------------+
| STATE  | BUSHELS | RANK() OVER (ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (ORDER BY BUSHELS DESC) |
|--------+---------+-------------------------------------+-------------------------------------------|
| Kansas |     130 |                                   1 |                                         1 |
| Kansas |     120 |                                   2 |                                         2 |
| Iowa   |     110 |                                   3 |                                         3 |
| Iowa   |     100 |                                   4 |                                         4 |
+--------+---------+-------------------------------------+-------------------------------------------+
Copy

Dentro de cada estado, mostrar a produção de milho dos agricultores em ordem decrescente, juntamente com a classificação da produção de cada agricultor individual (maior = 1):

SELECT state, bushels,
        RANK() OVER (PARTITION BY state ORDER BY bushels DESC),
        DENSE_RANK() OVER (PARTITION BY state ORDER BY bushels DESC)
    FROM corn_production;
+--------+---------+--------------------------------------------------------+--------------------------------------------------------------+
| STATE  | BUSHELS | RANK() OVER (PARTITION BY STATE ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (PARTITION BY STATE ORDER BY BUSHELS DESC) |
|--------+---------+--------------------------------------------------------+--------------------------------------------------------------|
| Iowa   |     110 |                                                      1 |                                                            1 |
| Iowa   |     100 |                                                      2 |                                                            2 |
| Kansas |     130 |                                                      1 |                                                            1 |
| Kansas |     120 |                                                      2 |                                                            2 |
+--------+---------+--------------------------------------------------------+--------------------------------------------------------------+
Copy

A consulta e a saída abaixo mostram como os valores de empate são tratados por ambas as funções RANK() e DENSE_RANK(). Observe que DENSE_RANK, as classificações são 1, 2, 3, 3, 4. Ao contrário da saída da função RANK(), a classificação 4 não é pulada porque havia um empate para a classificação 3.

SELECT state, bushels,
        RANK() OVER (ORDER BY bushels DESC),
        DENSE_RANK() OVER (ORDER BY bushels DESC)
    FROM corn_production;
+--------+---------+-------------------------------------+-------------------------------------------+
| STATE  | BUSHELS | RANK() OVER (ORDER BY BUSHELS DESC) | DENSE_RANK() OVER (ORDER BY BUSHELS DESC) |
|--------+---------+-------------------------------------+-------------------------------------------|
| Kansas |     130 |                                   1 |                                         1 |
| Kansas |     120 |                                   2 |                                         2 |
| Iowa   |     110 |                                   3 |                                         3 |
| Iowa   |     110 |                                   3 |                                         3 |
| Iowa   |     100 |                                   5 |                                         4 |
+--------+---------+-------------------------------------+-------------------------------------------+
Copy