Hoy he descubierto la función rank de mysql. La función RANK asigna un rango a cada fila dentro de la partición de un conjunto de resultados. El rango de una fila se especifica en uno más el número de rangos que le preceden.
La sintaxis de RANK es:
RANK() OVER ( PARTITION BY[{, ...}] ORDER BY [ASC|DESC], [{, ...}] )
Vamos a verlo con un ejemplo. Primero cargamos una tabla en nuestra base de datos
CREATE TABLE IF NOT EXISTS sales( sales_employee VARCHAR(50) NOT NULL, fiscal_year INT NOT NULL, sale DECIMAL(14,2) NOT NULL, PRIMARY KEY(sales_employee,fiscal_year) ); INSERT INTO sales(sales_employee,fiscal_year,sale) VALUES('Bob',2016,100), ('Bob',2017,150), ('Bob',2018,200), ('Alice',2016,150), ('Alice',2017,100), ('Alice',2018,200), ('John',2016,200), ('John',2017,150), ('John',2018,250);
Después de cargar la tabla se lanza la siguiente query:
SELECT sales_employee, fiscal_year, sale, RANK() OVER (PARTITION BY fiscal_year ORDER BY sale DESC ) sales_rank FROM sales;
Donde vemos que se usa la función rank y el resultado es:
sales_employee fiscal_year sale sales_rank John 2016 200.00 1 Alice 2016 150.00 2 Bob 2016 100.00 3 Bob 2017 150.00 1 John 2017 150.00 1 Alice 2017 100.00 3 John 2018 250.00 1 Bob 2018 200.00 2 Alice 2018 200.00 2
¿Que significa el resultado?
- Año 2016: John es el número 1 porque vendió 200 luego viene Alice que vendió 150 y luego Bob que vendió 100.
- Año 2017: Bob y John están en el número 1 porque vendieron 150 y Alice que vendió 100 está la 3.
- Año 2018: John está en el número 1 porque vendió 250 y Bob y Alice que vendieron 200 están la 2.
Si vais cambiando los valores entendereis mejor el funcionamiento de la función. Sobre todo por el año 2017.