Database
 sql >> Base de Dados >  >> RDS >> Database

Como classificar linhas dentro de uma partição no SQL

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.