Problema:
No conjunto de resultados, você gostaria de particionar registros e classificar linhas dentro de cada partição, adicionando outra coluna para mostrar as classificações das linhas dentro da partição.
Exemplo:
Nosso banco de dados possui uma tabela chamada magazine com dados nas seguintes colunas:
id
(chave primária), name
, category
, e price
. id | nome | categoria | preço |
---|---|---|---|
105 | Vida no campo | estilo de vida | 1,70 |
108 | Revista de notícias | notícias | 3,35 |
115 | Decibel | música | 6,50 |
123 | Revista de Bateria | música | 6,50 |
145 | Pôr do sol | estilo de vida | 12.00 |
155 | Mundo | estilo de vida | 9,50 |
158 | Teclado | música | 8,45 |
Vamos agrupar as revistas por categoria e classifique cada grupo em ordem decrescente por preço . Exiba a posição no ranking, nome, categoria e preço de cada revista.
Solução:
SELECT category, name, price, RANK() OVER (PARTITION BY category ORDER BY price DESC ) AS price_rank FROM magazine;
Aqui está o resultado:
categoria | nome | preço | price_rank |
---|---|---|---|
estilo de vida | Pôr do sol | 12.00 | 1 |
estilo de vida | Mundo | 9,50 | 2 |
estilo de vida | Vida no campo | 1,70 | 3 |
música | Teclado | 8,45 | 1 |
música | Decibel | 6,50 | 2 |
música | Revista de Bateria | 6,50 | 2 |
notícias | Revista de notícias | 3,35 | 1 |
Discussão:
Para particionar linhas e classificá-las por sua posição na partição, use a função RANK() com a cláusula PARTITION BY.
A função RANK() do SQL nos permite adicionar a posição de um registro dentro do conjunto de resultados ou dentro de cada partição. Em nosso exemplo, classificamos as linhas em uma partição.
A cláusula OVER() sempre vem depois de RANK(). OVER() deve conter uma cláusula ORDER BY. Se você estiver retornando classificações dentro de uma partição, coloque uma cláusula PARTITION BY dentro da cláusula OVER(). PARTITION BY é seguido por uma expressão ou nome de coluna; em nosso exemplo, usamos a coluna
category
(PARTITION BY category
). Observação: Se você não estiver usando partições, você pode omitir PARTITION BY e simplesmente colocar a cláusula ORDER BY em OVER().
Após PARTITION BY, coloque ORDER BY seguido dos nomes das colunas ou expressões de classificação. Em nosso exemplo, estamos classificando em ordem decrescente pela coluna
price
(ORDER BY price DESC
). A palavra-chave DESC indica uma ordem de classificação decrescente. No exemplo acima, usar RANK() com PARTITION BY dividiu os resultados definidos em grupos separados de revistas por sua categoria . Com cada grupo, as linhas foram classificadas por preço e, em seguida, classificado dentro desse grupo.