- Categorias:
Funções de janela (Relacionada à classificação, Quadro de janela)
RANK¶
Retorna a classificação de um valor dentro de um grupo ordenado de valores.
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¶
RANK() OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] [ <window_frame> ] )
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; entretanto, as lacunas na sequência resultam dos valores de empate.
Por exemplo, se as três primeiras linhas retornarem
1
, RANK pula2
e3
e atribui4
à próxima linha do grupo.Para evitar lacunas, use antes a função DENSE_RANK.
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);
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 | +--------+---------+-------------------------------------+-------------------------------------------+
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 | +--------+---------+--------------------------------------------------------+--------------------------------------------------------------+
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 | +--------+---------+-------------------------------------+-------------------------------------------+