Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie man in MySQL über die Partition rangiert

Manchmal müssen Sie möglicherweise in MySQL über Partitionen ranken oder in MySQL gruppierte Rankings durchführen. Wir werden uns ansehen, wie man mit der MySQL-Rank-Funktion über die Partition rangiert. Sie können diesen Ansatz verwenden, um innerhalb jeder Gruppe/Partition in einer Tabelle separat zu ranken. Bitte beachten Sie jedoch, dass diese Funktion nur ab MySQL 8.0 verfügbar ist.


MySQL-Rang über Partition

Wir werden die MySQL RANK()-Funktion verwenden, um innerhalb der Gruppe zu ranken. Hier ist die Syntax der MySQL RANK-Funktion.

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

Die Rangfunktion weist jeder Zeile innerhalb einer Partition einen Rang zu, sodass der Rang jeder Zeile um eins höher ist als die Gesamtzahl der Zeilen, die in dieser Partition eingestuft wurden.

In der obigen Syntax teilt die PARTITION BY-Klausel die Zeilen in Partitionen. Sie können eine Tabelle basierend auf einem oder mehreren Spaltenwerten partitionieren. Wenn Sie die Tabelle nicht partitionieren möchten, können Sie die PARTITION BY-Klausel einfach ganz weglassen.


Bonuslektüre:So ändern Sie die MySQL-Zeitzone in der Abfrage

Die Rangfunktion berechnet den Rang innerhalb jeder Partition/Gruppe und initialisiert die Rangnummer neu, wenn mit einer neuen Partition begonnen wird.

Die ORDER BY-Klausel sortiert die Zeilen innerhalb jeder Partition basierend auf Werten in einer oder mehreren Spalten.


Bonus-Leseartikel:MySQL-Datenbanken vergleichen

Nehmen wir an, Sie haben die folgende Tabelle.

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


Bonus-Lesetext:MySQL-Indexe in Datenbanken anzeigen

Hier ist die Abfrage, um jeder Zeile der Tabelle einen Rang zuzuweisen, ohne eine PARTITION BY-Klausel zu verwenden.

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

In der obigen Abfrage partitionieren wir die Tabelle nach Monatsnamen und ordnen dann jede Zeile innerhalb jeder Partition in absteigender Reihenfolge des Betrags.

Hoffentlich können Sie jetzt ganz einfach die MySQL Rank-Funktion verwenden, um über Partitionen und Gruppen zu ranken.

Ubiq macht es einfach, Daten innerhalb von Minuten zu visualisieren und in Echtzeit-Dashboards zu überwachen. Probieren Sie es noch heute aus!