sql >> Base de Datos >  >> RDS >> Database

Cómo clasificar filas dentro de una partición en SQL

Problema:

En el conjunto de resultados, le gustaría particionar registros y clasificar filas dentro de cada partición, agregando otra columna para mostrar las clasificaciones de las filas dentro de la partición.

Ejemplo:

Nuestra base de datos tiene una tabla llamada magazine con datos en las siguientes columnas:id (clave principal), name , category y price .

id nombre categoría precio
105 Vida en el campo estilo de vida 1,70
108 Revista de noticias noticias 3,35
115 Decibelios música 6,50
123 Revista de batería música 6,50
145 Puesta de sol estilo de vida 12.00
155 Mundo estilo de vida 9,50
158 Teclado música 8,45

Agrupemos las revistas según categoría y clasifique cada grupo en orden descendente por precio . Muestra la posición en el ranking, el nombre, la categoría y el precio de cada revista.

Solución:

SELECT  
  category,
  name,
  price,
  RANK() OVER (PARTITION BY category
                    ORDER BY price DESC
                    ) AS price_rank
FROM magazine;

Aquí está el resultado:

categoría nombre precio precio_rango
estilo de vida Puesta de sol 12.00 1
estilo de vida Mundo 9,50 2
estilo de vida Vida en el campo 1,70 3
música Teclado 8,45 1
música Decibelios 6,50 2
música Revista de batería 6,50 2
noticias Revista de noticias 3,35 1

Discusión:

Para particionar filas y clasificarlas por su posición dentro de la partición, utilice la función RANK() con la cláusula PARTITION BY.

La función RANK() de SQL nos permite agregar la posición de un registro dentro del conjunto de resultados o dentro de cada partición. En nuestro ejemplo, clasificamos filas dentro de una partición.

La cláusula OVER() siempre viene después de RANK(). OVER() debe contener una cláusula ORDER BY. Si está devolviendo rangos dentro de una partición, coloque una cláusula PARTITION BY dentro de la cláusula OVER(). A PARTITION BY le sigue una expresión o un nombre de columna; en nuestro ejemplo, usamos la columna category (PARTITION BY category ).

Nota: Si no está utilizando particiones, puede omitir PARTITION BY y simplemente colocar la cláusula ORDER BY en OVER().

Después de PARTICIÓN POR, coloque ORDEN POR seguido de los nombres de las columnas o expresiones de clasificación. En nuestro ejemplo, estamos clasificando en orden descendente por la columna price (ORDER BY price DESC ). La palabra clave DESC indica un orden de clasificación descendente.

En el ejemplo anterior, usando RANK() con PARTITION BY dividió el conjunto de resultados en grupos separados de revistas por su categoría . Con cada grupo, las filas se ordenaron por precio y luego clasificado dentro de ese grupo.