Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment classer sur une partition dans MySQL

Parfois, vous devrez peut-être classer les partitions dans MySQL ou effectuer un classement groupé dans MySQL. Nous verrons comment classer les partitions à l'aide de la fonction de classement MySQL. Vous pouvez utiliser cette approche pour classer séparément chaque groupe/partition dans un tableau. Cependant, veuillez noter que cette fonction n'est disponible qu'à partir de MySQL 8.0.


Classement MySQL sur la partition

Nous utiliserons la fonction MySQL RANK() pour classer au sein du groupe. Voici la syntaxe de la fonction MySQL RANK.

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

La fonction de classement attribue un rang à chaque ligne d'une partition de sorte que le rang de chaque ligne soit un de plus que le nombre total de lignes qui ont été classées dans cette partition.

Dans la syntaxe ci-dessus, la clause PARTITION BY divisera les lignes en partitions. Vous pouvez partitionner une table en fonction d'une ou plusieurs valeurs de colonne. Si vous ne souhaitez pas partitionner la table, vous pouvez simplement omettre complètement la clause PARTITION BY.


Lecture bonus :Comment changer le fuseau horaire MySQL dans la requête

La fonction Rank calculera le rang au sein de chaque partition/groupe et réinitialisera le numéro de rang lors du démarrage avec une nouvelle partition.

La clause ORDER BY trie les lignes de chaque partition en fonction des valeurs d'une ou plusieurs colonnes.


Lecture bonus :Comparaison de bases de données MySQL

Disons que vous avez le tableau suivant.

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 |
+------+-------+--------+


Lecture bonus :MySQL Afficher les index dans les bases de données

Voici la requête pour attribuer un rang à chaque ligne de la table, sans utiliser de clause 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  |
+------+-------+--------+--------+

Dans la requête ci-dessus, nous divisons la table par nom de mois, puis classons chaque ligne dans chaque partition par ordre décroissant de montant.

J'espère maintenant que vous pouvez facilement utiliser la fonction MySQL Rank pour classer les partitions et les groupes.

Ubiq facilite la visualisation des données en quelques minutes et la surveillance dans des tableaux de bord en temps réel. Essayez-le aujourd'hui !