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

¿Cuál es la diferencia entre RANK y DENSE_RANK en SQL?

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