Função de janela RANK - Amazon Redshift

Função de janela RANK

A função de janela RANK determina a classificação de um valor em um grupo de valores com base na expressão ORDER BY da cláusula OVER. Se a cláusula opcional PARTITION BY estiver presente, as classificações são redefinidas para cada grupo de linhas. Linhas com valores iguais para os critérios de classificação recebem a mesma classificação. O Amazon Redshift adiciona o número de linhas amarradas à classificação amarrada para calcular a próxima classificação e, assim, as classificações podem não ser números consecutivos. Por exemplo, se duas linhas são classificadas como 1, a classificação seguinte é 3.

RANK difere de Função de janela DENSE_RANK em um aspecto: para DENSE_RANK, se duas ou mais linhas empatarem, não há uma lacuna na sequência de valores classificados. Por exemplo, se duas linhas são classificadas como 1, a classificação seguinte é 2.

Você pode ter funções de classificação com diferentes cláusulas PARTITION BY e ORDER BY na mesma consulta.

Sintaxe

RANK () OVER ( [ PARTITION BY expr_list ] [ ORDER BY order_list ] )

Argumentos

( )

A função não aceita argumentos, mas os parênteses vazios são necessários.

OVER

As cláusulas de janela para a função RANK.

PARTITION BY expr_list

Opcional. Uma ou várias expressões que definem a janela.

ORDER BY order_list

Opcional. Define as colunas nas quais os valores de classificação se baseiam. Se nenhuma PARTITION BY for especificada, ORDER BY usa a tabela completa. Se ORDER BY for omitida, o valor de retorno será 1 para todas as linhas.

Se ORDER BY não produzir uma ordenação exclusiva, a ordem das linhas será não determinística. Para obter mais informações, consulte Ordenação exclusiva de dados para funções da janela.

Tipo de retorno

INTEGER

Exemplos

O exemplo a seguir ordena a tabela pela quantidade vendida (padrão crescente) e atribui uma classificação a cada linha. O valor de classificação de 1 é o valor de classificação mais alto. Os resultados são classificados após a aplicação dos resultados da função de janela:

select salesid, qty, rank() over (order by qty) as rnk from winsales order by 2,1; salesid | qty | rnk --------+-----+----- 10001 | 10 | 1 10006 | 10 | 1 30001 | 10 | 1 40005 | 10 | 1 30003 | 15 | 5 20001 | 20 | 6 20002 | 20 | 6 30004 | 20 | 6 10005 | 30 | 9 30007 | 30 | 9 40001 | 40 | 11 (11 rows)

Observe que a cláusula ORDER BY externa neste exemplo inclui as colunas 2 e 1 para garantir que o Amazon Redshift retorne resultados classificados de forma consistente sempre que esta consulta for executada. Por exemplo, as linhas com IDs de venda 10.001 e 10.006 têm valores idênticos de QTY e RNK. Ordenar o conjunto de resultados final pela coluna 1 garante que a linha 10.001 sempre caia antes de 10.006. Para uma descrição da tabela WINSALES, consulte Amostra de tabela para exemplos de funções de janela.

No exemplo a seguir, a ordenação é revertida para a função da janela (order by qty desc). Agora, o valor de classificação mais alto se aplica ao valor de QTY mais alto.

select salesid, qty, rank() over (order by qty desc) as rank from winsales order by 2,1; salesid | qty | rank ---------+-----+----- 10001 | 10 | 8 10006 | 10 | 8 30001 | 10 | 8 40005 | 10 | 8 30003 | 15 | 7 20001 | 20 | 4 20002 | 20 | 4 30004 | 20 | 4 10005 | 30 | 2 30007 | 30 | 2 40001 | 40 | 1 (11 rows)

Para uma descrição da tabela WINSALES, consulte Amostra de tabela para exemplos de funções de janela.

O exemplo a seguir particiona a tabela por SELLERID e ordena cada partição pela quantidade (em ordem decrescente) e atribui uma classificação a cada linha. Os resultados são classificados após a aplicação dos resultados da função de janela.

select salesid, sellerid, qty, rank() over (partition by sellerid order by qty desc) as rank from winsales order by 2,3,1; salesid | sellerid | qty | rank --------+----------+-----+----- 10001 | 1 | 10 | 2 10006 | 1 | 10 | 2 10005 | 1 | 30 | 1 20001 | 2 | 20 | 1 20002 | 2 | 20 | 1 30001 | 3 | 10 | 4 30003 | 3 | 15 | 3 30004 | 3 | 20 | 2 30007 | 3 | 30 | 1 40005 | 4 | 10 | 2 40001 | 4 | 40 | 1 (11 rows)