sql >> Base de Datos >  >> RDS >> Mysql

Cómo clasificar sobre la partición en MySQL

A veces, es posible que deba clasificar sobre la partición en MySQL o hacer una clasificación agrupada en MySQL. Veremos cómo clasificar sobre la partición usando la función de clasificación de MySQL. Puede usar este enfoque para clasificar dentro de cada grupo/partición en una tabla por separado. Sin embargo, tenga en cuenta que esta función solo está disponible desde MySQL 8.0.


Clasificación de MySQL sobre la partición

Usaremos la función MySQL RANK() para clasificar dentro del grupo. Aquí está la sintaxis de la función RANK de MySQL.

RANK() OVER (
    PARTITION BY <expression>[{,<expression>...}]
    ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
)

La función de rango asigna un rango a cada fila dentro de una partición, de modo que el rango de cada fila es uno más que el número total de filas que se clasificaron en esa partición.

En la sintaxis anterior, la cláusula PARTITION BY dividirá las filas en particiones. Puede particionar una tabla en función de uno o más valores de columna. Si no desea particionar la tabla, simplemente puede omitir la cláusula PARTITION BY por completo.


Lectura adicional:Cómo cambiar la zona horaria de MySQL en la consulta

La función de rango calculará el rango dentro de cada partición/grupo y reinicializará el número de rango al comenzar con una nueva partición.

La cláusula ORDER BY ordena las filas dentro de cada partición según los valores en una o más columnas.


Lectura adicional:Comparar bases de datos MySQL

Digamos que tienes la siguiente tabla.

mysql> create table for_rank(id int, month  varchar(10),amount  int);

mysql> insert into for_rank(id, month, amount)
     values(1,'Jan',450),
     (2,'Jan',350),
     (3,'Jan',250),
     (4,'Feb',150),
     (5,'Feb',450),
     (6,'Feb',500),
     (7,'Mar',350),
     (8,'Mar',450),
     (9,'Mar',250),
     (10,'Mar',150);

mysql> select * from for_rank;
+------+-------+--------+
| id   | month | amount |
+------+-------+--------+
|    1 | Jan   |    450 |
|    2 | Jan   |    350 |
|    3 | Jan   |    250 |
|    4 | Feb   |    150 |
|    5 | Feb   |    450 |
|    6 | Feb   |    500 |
|    7 | Mar   |    350 |
|    8 | Mar   |    450 |
|    9 | Mar   |    250 |
|   10 | Mar   |    150 |
+------+-------+--------+


Lectura adicional:MySQL Mostrar índices en bases de datos

Aquí está la consulta para asignar rango a cada fila de la tabla, sin usar ninguna cláusula PARTITION BY.

SELECT
     id, month, amount, RANK() OVER (
     PARTITION BY Month
     ORDER BY amount desc
     ) my_rank
FROM for_rank;

+------+-------+--------+--------+
| id   | month | amount |  rank  |
+------+-------+--------+--------+
|    6 | Feb   |    500 |     1  |
|    5 | Feb   |    450 |     2  |
|    4 | Feb   |    150 |     3  |
|    1 | Jan   |    450 |     1  |
|    2 | Jan   |    350 |     2  |
|    3 | Jan   |    250 |     3  |
|    8 | Mar   |    450 |     1  |
|    7 | Mar   |    350 |     2  |
|    9 | Mar   |    250 |     3  |
|   10 | Mar   |    150 |     4  |
+------+-------+--------+--------+

En la consulta anterior, dividimos la tabla por nombre de mes y luego clasificamos cada fila dentro de cada partición en orden descendente de cantidad.

Con suerte, ahora puede usar fácilmente la función MySQL Rank para clasificar sobre particiones y grupos.

Ubiq facilita la visualización de datos en minutos y la supervisión en paneles en tiempo real. ¡Pruébalo hoy!