Problema:
Quiere comparar las clasificaciones producidas por RANK
y DENSE_RANK
y agréguelos como nuevas columnas a una tabla.
Ejemplo:
Nuestra base de datos tiene una tabla llamada sales_assistant
con datos en las siguientes columnas:id
(clave principal), first_name
, last_name
, month
y sold products
.
id | nombre | apellido | mes | productos vendidos |
---|---|---|---|---|
1 | Lisa | Negro | 5 | 2300 |
2 | María | Jacobs | 5 | 2400 |
3 | Lisa | Negro | 6 | 2700 |
4 | María | Jacobs | 6 | 2700 |
5 | Álex | Smith | 6 | 2900 |
6 | María | Jacobs | 7 | 1200 |
7 | Lisa | Negro | 7 | 1200 |
8 | Álex | Smith | 7 | 1000 |
Vamos a mostrar el nombre y apellido de cada asistente de ventas y la cantidad de productos vendidos. También queremos clasificarlos en términos de la cantidad de productos vendidos en orden descendente.
Solución 1:
SELECT RANK() OVER(ORDER BY sold products DESC) AS r, DENSE_RANK() OVER(ORDER BY sold products DESC) AS dr, first_name, last_name, month, sold products FROM sales_assistant;
Esta consulta devuelve dos clasificaciones:una producida por RANK
y otro por DENSE_RANK
. ¿Cuál es la diferencia?
En pocas palabras, RANK
salta el número de posiciones después de los registros con el mismo número de rango. La clasificación RANK_DENSE
devuelve números de posición del 1 al 6 porque no omite registros con el mismo número de rango:
r | dr | nombre | apellido | mes | productos vendidos |
---|---|---|---|---|---|
1 | 1 | Álex | Smith | 6 | 2900 |
2 | 2 | Lisa | Negro | 6 | 2700 |
2 | 2 | María | Jacobs | 6 | 2700 |
4 | 3 | María | Jacobs | 5 | 2400 |
5 | 4 | Lisa | Negro | 5 | 2300 |
6 | 5 | María | Jacobs | 7 | 1200 |
6 | 5 | Lisa | Negro | 7 | 1200 |
8 | 6 | Álex | Smith | 7 | 1000 |
Discusión:
Si desea clasificar filas en el conjunto de resultados, SQL ofrece el RANK()
y DENSE_RANK
funciones Estas funciones se utilizan en SELECT
con otras columnas. Después de RANK
o DENSE_RANK
, llamamos al OVER()
función, que toma un ORDER BY
cláusula con el nombre de la columna a ordenar antes de asignar una clasificación.
A diferencia de DENSE_RANK
, RANK
salta posiciones después de clasificaciones iguales. El número de posiciones omitidas depende de cuántas filas tenían una clasificación idéntica. Por ejemplo, Mary y Lisa vendieron la misma cantidad de productos y ambas ocupan el segundo lugar. Con RANK
, la siguiente posición es #4; con DENSE_RANK
, la siguiente posición es la #3.
Ambos RANK
y RANK_DENSE
trabajar en particiones de datos:
Solución 1:
SELECT RANK() OVER(PARTITION BY month ORDER BY sold products DESC) AS r, DENSE_RANK() OVER(PARTITION BY month ORDER BY sold products DESC) AS dr, first_name, last_name, month, sold products FROM sales_assistant;
Puede dividir registros en grupos según una columna dada (en nuestro ejemplo, month
). En esta situación, los registros se clasifican como parte de una partición:
r | dr | nombre | apellido | mes | productos vendidos |
---|---|---|---|---|---|
1 | 1 | María | Jacobs | 5 | 2400 |
2 | 2 | Lisa | Negro | 5 | 2300 |
1 | 1 | Álex | Smith | 6 | 2900 |
2 | 2 | Lisa | Negro | 6 | 2700 |
2 | 2 | María | Jacobs | 6 | 2700 |
1 | 1 | María | Jacobs | 7 | 1200 |
1 | 1 | Lisa | Negro | 7 | 1200 |
3 | 2 | Álex | Smith | 7 | 1000 |