sql >> Database >  >> RDS >> Mysql

Hoe te rangschikken over partitie in MySQL

Soms moet u in MySQL rangschikken over partities of gegroepeerd rangschikken in MySQL. We zullen bekijken hoe u de partitie kunt rangschikken met behulp van de MySQL-rangfunctie. U kunt deze benadering gebruiken om binnen elke groep/partitie afzonderlijk in een tabel te rangschikken. Houd er echter rekening mee dat deze functie alleen beschikbaar is vanaf MySQL 8.0.


MySQL-rangschikking boven partitie

We zullen de functie MySQL RANK() gebruiken om binnen een groep te rangschikken. Hier is de syntaxis van de MySQL RANK-functie.

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

De rangfunctie wijst een rangorde toe aan elke rij binnen een partitie, zodat de rangorde van elke rij één meer is dan het totale aantal rijen dat in die partitie is gerangschikt.

In de bovenstaande syntaxis verdeelt de clausule PARTITION BY de rijen in partities. U kunt een tabel partitioneren op basis van een of meer kolomwaarden. Als u de tabel niet wilt partitioneren, kunt u de clausule PARTITION BY gewoon helemaal weglaten.


Bonus Lezen:MySQL-tijdzone wijzigen in query

De functie Rang berekent de rang binnen elke partitie/groep en initialiseert het rangnummer opnieuw wanneer met een nieuwe partitie wordt gestart.

ORDER BY-component sorteert de rijen binnen elke partitie op basis van waarden in een of meer kolommen.


Bonus Lezen:MySQL Vergelijk databases

Laten we zeggen dat je de volgende tabel hebt.

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 Lezen:MySQL Toon indexen in databases

Dit is de vraag om een ​​rang toe te kennen aan elke rij van de tabel, zonder een PARTITION BY-clausule te gebruiken.

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 de bovenstaande query partitioneren we de tabel op maandnaam en rangschikken we elke rij binnen elke partitie in aflopende volgorde van bedrag.

Hopelijk kun je nu gemakkelijk de MySQL Rank-functie gebruiken om over partities en groepen te rangschikken.

Ubiq maakt het gemakkelijk om gegevens binnen enkele minuten te visualiseren en in realtime dashboards te controleren. Probeer het vandaag nog!

  1. Escape een tekenreeks in SQL Server zodat het veilig is om te gebruiken in LIKE-expressie

  2. Syntaxisfout door het gebruik van een gereserveerd woord als tabel- of kolomnaam in MySQL

  3. Hoe een SSIS-pakket uit te voeren vanuit .NET?

  4. Jenkins gebruiken met Kubernetes AWS, deel 1