sql >> Database teknologi >  >> RDS >> Mysql

Sådan rangeres over partition i MySQL

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!

  1. Genbruger du SqlCommand?

  2. Oracle Security Alert for CVE-2021-44228

  3. Migrering af Google Cloud SQL til MySQL til en On-Prem Server

  4. COUNT() Funktion i MariaDB