sql >> Databasteknik >  >> RDS >> Mysql

Hur man får radnummer i MySQL

Ibland kan du behöva få radnummer i MySQL för rapportering och analys. Radnummer är mycket användbart för att rangordna och sortera data. Det är också användbart för att filtrera data baserat på radnummervärde. I den här artikeln kommer vi att titta på hur du får radnummer i MySQL.


Hur får man radnummer i MySQL

Funktionen Row_number() är tillgänglig direkt sedan MySQL 8.0.

Här är syntaxen för row_number() syntax. Observera att PARTITION BY-satsen är valfri.

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

Låt oss säga att du har följande försäljning bord.

 +------+------------+--------+
 | 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 |
 +------+------------+--------+

Här är ett exempel på hur du använder radnummer funktion för att rangordna rader i fallande ordning efter belopp kolumn.

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 ovanstående fråga behandlar vi hela tabellen som en enda partition och tillhandahåller inte PARTITION BY-klausul. Vi ordnar även dessa rader i fallande ordning efter mängdkolumnen och använder row_number() funktion för att rangordna dessa rader.

Men om du använder MySQL <8.0 så här är stegen för att få radnummer 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 ovanstående SQL-fråga använder vi en temporär variabel rownum för att lagra radnummer. När MySQL sekventiellt korsar raderna tilldelar den rownum till varje rad på ett stegvis sätt.

Behöver du ett rapporteringsverktyg för MySQL? Ubiq gör det enkelt att visualisera data på några minuter och övervaka i realtidsinstrumentpaneler. Prova det idag!

  1. sql join two table

  2. Finns det en SQLite som motsvarar MySQL:s DESCRIBE [tabell]?

  3. Fristående MySQL-server

  4. PostgreSQL-processnamn på Solaris