Ibland kan du behöva ranka över partitionen i MySQL eller göra grupperad rankning i MySQL. Vi kommer att titta på hur man rankar över partition med MySQL rank funktion. Du kan använda detta tillvägagångssätt för att rangordna inom varje grupp/partition i en tabell separat. Observera dock att den här funktionen endast är tillgänglig från MySQL 8.0.
MySQL Rank över partition
Vi kommer att använda MySQL RANK()-funktionen för att rangordna inom gruppen. Här är syntaxen för MySQL RANK-funktionen.
RANK() OVER (
PARTITION BY <expression>[{,<expression>...}]
ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
) Rangeringsfunktionen tilldelar en rangordning till varje rad inom en partition så att varje rads rang är en mer än det totala antalet rader som har rangordnats i den partitionen.
I ovanstående syntax kommer PARTITION BY-satsen att dela upp raderna i partitioner. Du kan partitionera en tabell baserat på ett eller flera kolumnvärden. Om du inte vill partitionera tabellen kan du helt enkelt utelämna PARTITION BY-satsen helt och hållet.
Bonus Läs:Hur man ändrar MySQL-tidszon i fråga
Rank-funktionen kommer att beräkna rang inom varje partition/grupp och återinitiera rangnumret när man börjar med en ny partition.
ORDER BY-satsen sorterar raderna inom varje partition baserat på värden i en eller flera kolumner.
Bonus Läs:MySQL Jämför databaser
Låt oss säga att du har följande tabell.
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 Visa index i databaser
Här är frågan för att tilldela rangordning till varje rad i tabellen, utan att använda någon PARTITION BY-sats.
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 ovanstående fråga delar vi upp tabellen efter månadsnamn och rangordnar sedan varje rad inom varje partition i fallande ordning efter belopp.
Förhoppningsvis kan du nu enkelt använda MySQL Rank-funktionen för att rangordna över partitioner och grupper.
Ubiq gör det enkelt att visualisera data på några minuter och övervaka i realtidsinstrumentpaneler. Prova det idag!