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
).
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.