- Categorias:
Funções de janela (classificação)
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 uma sintaxe window_frame
detalhada, consulte Sintaxe e uso da função de janela.
Argumentos¶
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 quiser apenas um único grupo (por exemplo, se deseja 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 manipulados pelas 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 |
+--------+---------+-------------------------------------+-------------------------------------------+