sql >> Databasteknik >  >> RDS >> Mysql

Hur man rangordnar över partition i MySQL

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!

  1. Foreign Key SQL:Allt du behöver veta om främmande nyckeloperationer

  2. Migrera en Microsoft Access-databas till SQL Server

  3. RADIANS() Exempel i SQL Server

  4. Förstå DROP TABLE-satsen i SQL Server