Nogle gange kan du være nødt til at rangere over partition i MySQL eller lave grupperet rangering i MySQL. Vi vil se på, hvordan man rangerer over partition ved hjælp af MySQL rangfunktion. Du kan bruge denne tilgang til at rangere inden for hver gruppe/partition i en tabel separat. Bemærk dog, at denne funktion kun er tilgængelig fra MySQL 8.0.
MySQL rang over partition
Vi vil bruge MySQL RANK()-funktionen til at rangere inden for gruppen. Her er syntaksen for MySQL RANK-funktionen.
RANK() OVER (
PARTITION BY <expression>[{,<expression>...}]
ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
) Rangeringsfunktionen tildeler en rangering til hver række inden for en partition, således at hver rækkes rangering er én mere end det samlede antal rækker, der er blevet rangeret i den partition.
I ovenstående syntaks vil PARTITION BY-klausulen opdele rækkerne i partitioner. Du kan partitionere en tabel baseret på en eller flere kolonneværdier. Hvis du ikke ønsker at partitionere tabellen, kan du simpelthen udelade PARTITION BY-sætningen helt.
Bonus Læs:Sådan ændres MySQL-tidszone i forespørgsel
Rangeringsfunktionen vil beregne rang inden for hver partition/gruppe og geninitialisere rangnummeret, når du starter med en ny partition.
ORDER BY-klausulen sorterer rækkerne i hver partition baseret på værdier i en eller flere kolonner.
Bonus Læs:MySQL Sammenlign databaser
Lad os sige, at du har følgende tabel.
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 Læs:MySQL Vis indekser i databaser
Her er forespørgslen for at tildele rang til hver række i tabellen uden at bruge nogen PARTITION BY-klausul.
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 |
+------+-------+--------+--------+
I ovenstående forespørgsel opdeler vi tabellen efter månedsnavn og rangerer derefter hver række inden for hver partition i faldende rækkefølge efter mængde.
Forhåbentlig kan du nu nemt bruge MySQL Rank-funktionen til at rangere over partitioner og grupper.
Ubiq gør det nemt at visualisere data på få minutter og overvåge i dashboards i realtid. Prøv det i dag!