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

Sådan får du row_number i MySQL

Nogle gange skal du muligvis få rækkenummer i MySQL til rapportering og analyse. Rækkenummer er meget nyttigt til rangering og sortering af data. Det er også nyttigt til at filtrere data baseret på rækkenummerværdi. I denne artikel vil vi se på, hvordan du får rækkenummer i MySQL.


Sådan får du row_number i MySQL

Funktionen Row_number() er tilgængelig direkte fra boksen siden MySQL 8.0.

Her er syntaksen for row_number() syntaks. Bemærk venligst, at PARTITION BY-klausulen er valgfri.

ROW_NUMBER() OVER (
     PARTITION BY <expression(s)> 
     ORDER BY <expression(s)> [ASC|DESC])

Lad os sige, at du har følgende salg tabel.

 +------+------------+--------+
 | id   | order_date | amount |
 +------+------------+--------+
 |    1 | 2021-01-01 |    200 |
 |    2 | 2021-01-02 |    250 |
 |    3 | 2021-01-03 |    220 |
 |    4 | 2021-01-04 |    230 |
 |    5 | 2021-01-05 |    210 |
 |    6 | 2021-01-06 |    100 |
 |    7 | 2021-01-07 |    120 |
 |    8 | 2021-01-08 |    150 |
 |    9 | 2021-01-09 |    180 |
 |   10 | 2021-01-10 |    200 |
 +------+------------+--------+

Her er et eksempel på brug af rækkenummer funktion til at rangere rækker i faldende rækkefølge efter beløb kolonne.

mysql> select row_number() over (
       order by amount desc) row_num,
       amount
       from sales
       order by amount desc;
 +---------+--------+
 | row_num | amount |
 +---------+--------+
 |       1 |    250 |
 |       2 |    230 |
 |       3 |    220 |
 |       4 |    210 |
 |       5 |    200 |
 |       6 |    200 |
 |       7 |    180 |
 |       8 |    150 |
 |       9 |    120 |
 |      10 |    100 |
 +---------+--------+

I ovenstående forespørgsel behandler vi hele tabellen som en enkelt partition og giver ikke PARTITION BY-klausul. Vi bestiller også disse rækker i faldende rækkefølge efter beløbskolonnen og bruger row_number() funktion til at rangere disse rækker.

Men hvis du bruger MySQL <8.0, så er her trinene til at få rækkenummer i MySQL.

mysql> SELECT t.*, @rownum := @rownum + 1 AS rank 
          FROM sales t, (SELECT @rownum := 0) r  
          order by amount desc;
 +------+---------------------+--------+------+
 | id   | order_date          | amount | rank |
 +------+---------------------+--------+------+
 |    1 | 2021-02-02 08:15:00 |    250 |    1 |
 |   10 | 2021-02-02 11:15:00 |    250 |    2 |
 |    5 | 2021-02-02 09:30:00 |    250 |    3 |
 |    9 | 2021-02-02 10:45:00 |    200 |    4 |
 |   12 | 2021-02-02 11:45:00 |    200 |    5 |
 |    6 | 2021-02-02 09:45:00 |    200 |    6 |
 |    2 | 2021-02-02 08:30:00 |    200 |    7 |
 |    7 | 2021-02-02 10:15:00 |    180 |    8 |
 |    3 | 2021-02-02 08:55:00 |    150 |    9 |
 |   11 | 2021-02-02 11:30:00 |    150 |   10 |
 |    4 | 2021-02-02 09:15:00 |    125 |   11 |
 |    8 | 2021-02-02 10:30:00 |    125 |   12 |
 +------+---------------------+--------+------+

I ovenstående SQL-forespørgsel bruger vi en midlertidig variabel rownum for at gemme rækkenummer. Når MySQL sekventielt krydser rækkerne, tildeler den rownum til hver række på en trinvis måde.

Har du brug for et rapporteringsværktøj til MySQL? Ubiq gør det nemt at visualisere data på få minutter og overvåge i dashboards i realtid. Prøv det i dag!

  1. Hvordan kan jeg undslippe kantede parenteser i en LIKE-klausul?

  2. Oracle Concurrent Manager

  3. ALL_PROCEDURES-visningen viser ikke PROCEDURE_NAME

  4. Webinar:Nye funktioner i PostgreSQL 11 [Opfølgning]