Blog de Gonzalo

Blog de programación de Gonzalo López

FUNCIÓN DENSE RANK DE MYSQL

MYSQL

La función rank de mysql. se engloba dentro de lo que son las funciones ventana de mysql y es similar a la función rank en mysql.
Esta función determina la clasificación de un valor en un grupo de valores, según la expresión "ORDER BY" en la cláusula "OVER". Si hay una cláusula opcional PARTITION BY, las clasificaciones de restablecen para cada grupo de filas. Las filas que tienen valores iguales reciben la misma clasificación. La función DENSE RANK se diferencia de la función RANK en el que si se vinculan dos o más filas, no hay brecha en la secuencia de valores clasificados.
En el siguiente ejemplo, se divide la tabla según sellerid, se ordena cada partición según la cantidad y se asigna una clasificación densa a cada fila. Los resultados se ordenan después de que se apliquen los resultados de la función de ventana.


SELECT salesid, qty,
DENSE_RANK() OVER(ORDER BY qty DESC) AS d_rnk,
RANK() OVER(ORDER BY qty DESC) AS rnk
FROM winsales
ORDER BY 2,1;

+---------+-----+-------+-----+
| salesid | qty | d_rnk | rnk |
+---------+-----+-------+-----+
|   10001 |  10 |     5 |   8 |
|   10006 |  10 |     5 |   8 |
|   30001 |  10 |     5 |   8 |
|   40005 |  10 |     5 |   8 |
|   30003 |  15 |     4 |   7 |
|   20001 |  20 |     3 |   4 |
|   20002 |  20 |     3 |   4 |
|   30004 |  20 |     3 |   4 |
|   10005 |  30 |     2 |   2 |
|   30007 |  30 |     2 |   2 |
|   40001 |  40 |     1 |   1 |
+---------+-----+-------+-----+

En el siguiente ejemplo, se divide la tabla según buyerid y sellerid, se ordena cada partición según la cantidad y se asigna a cada fila una clasificación densa y regular. Los resultados se ordenan después de que se aplique la función de ventana:


SELECT salesid, sellerid, qty, buyerid,
DENSE_RANK() OVER(PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS d_rnk,
RANK() OVER (PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS rnk
FROM winsales
ORDER BY rnk;
+---------+----------+-----+---------+-------+-----+
| salesid | sellerid | qty | buyerid | d_rnk | rnk |
+---------+----------+-----+---------+-------+-----+
|   20001 |        2 |  20 | b       |     1 |   1 |
|   30007 |        3 |  30 | c       |     1 |   1 |
|   10006 |        1 |  10 | c       |     1 |   1 |
|   10005 |        1 |  30 | a       |     1 |   1 |
|   20002 |        2 |  20 | c       |     1 |   1 |
|   30009 |        3 |  20 | b       |     1 |   1 |
|   40001 |        4 |  40 | a       |     1 |   1 |
|   30004 |        3 |  20 | b       |     1 |   1 |
|   10001 |        1 |  10 | c       |     1 |   1 |
|   40005 |        4 |  10 | a       |     2 |   2 |
|   30003 |        3 |  15 | b       |     2 |   3 |
|   30001 |        3 |  10 | b       |     3 |   4 |
+---------+----------+-----+---------+-------+-----+

Compartir en twitter