sql >> Databasteknik >  >> RDS >> Mysql

Hur man får sista posten i varje grupp i MySQL

Ibland kan du behöva välja den senaste posten eller få den senaste posten för varje datum, användare, id eller någon annan grupp. Här är SQL-frågan för att få sista posten i varje grupp i MySQL, eftersom det inte finns någon inbyggd funktion för den. Du kan också använda den för att välja sista raden för varje grupp i PostgreSQL, SQL Server och Oracle.

Hur får man sista posten i varje grupp i MySQL

Här är stegen för att få sista posten i varje grupp i MySQL.

Låt oss säga att du har en tabell product_sales(product, order_date,sale) som innehåller försäljningsdata för flera produkter.

mysql> create table product_sales(product varchar(255),order_date date, sale int);

mysql> insert into product_sales(product,order_date, sale)
     values('A','2020-05-01',250),
     ('B','2020-05-01',350),
     ('C','2020-05-01',1250),
     ('A','2020-05-02',450),
     ('B','2020-05-02',650),
     ('C','2020-05-02',1050),
     ('A','2020-05-03',150),
     ('B','2020-05-03',250),
     ('C','2020-05-03',1850);

mysql> select * from product_sales;
+---------+------------+------+
| product | order_date | sale |
+---------+------------+------+
| A       | 2020-05-01 |  250 |
| B       | 2020-05-01 |  350 |
| C       | 2020-05-01 | 1250 |
| A       | 2020-05-02 |  450 |
| B       | 2020-05-02 |  650 |
| C       | 2020-05-02 | 1050 |
| A       | 2020-05-03 |  150 |
| B       | 2020-05-03 |  250 |
| C       | 2020-05-03 | 1850 |
+---------+------------+------+

Bonus Läs:Hur man får rekord med maxvärde i MySQL

Låt oss säga att du vill få sista posten i varje grupp, det vill säga för varje produkt. Först använder vi GROUP BY för att få senaste datum för varje grupp.

mysql> select product,max(order_date) from product_sales group by product;
+---------+-----------------+
| product | max(order_date) |
+---------+-----------------+
| A       | 2020-05-03      |
| B       | 2020-05-03      |
| C       | 2020-05-03      |
+---------+-----------------+

Nu när vi vet det senaste datumet för varje grupp sammanfogar vi detta resultat med vår ursprungliga tabell för att få senaste post efter datumgrupp.

mysql> select product_sales.* from product_sales,
           (select product,max(order_date) as order_date
                from product_sales
                group by product) max_sales
             where product_sales.product=max_sales.product
             and product_sales.order_date=max_sales.order_date;
+---------+------------+------+
| product | order_date | sale |
+---------+------------+------+
| A       | 2020-05-03 |  150 |
| B       | 2020-05-03 |  250 |
| C       | 2020-05-03 | 1850 |
+---------+------------+------+

Bonus Läs:Hur man skapar vy i MySQL

Hur man väljer den senaste posten för varje användare

På samma sätt kan du välja den senaste posten för varje användare eller få den senaste posten för varje id. Anta att du har följande tabell user_data(user_id,transaction_date,sale) med användartransaktionsdata

mysql> create table user_data(user_id int, transaction_date date, sale int);

mysql> insert into user_data(user_id,transaction_date, sale)
          values('1','2020-05-01',25),
          ('2','2020-05-01',35),
          ('3','2020-05-01',125),
          ('1','2020-05-02',40),
          ('2','2020-05-02',50),
          ('3','2020-05-02',50),
          ('1','2020-05-03',15),
          ('2','2020-05-03',25),
          ('3','2020-05-03',50);


mysql> select * from user_data;
+---------+------------------+------+
| user_id | transaction_date | sale |
+---------+------------------+------+
|       1 | 2020-05-01       |   25 |
|       2 | 2020-05-01       |   35 |
|       3 | 2020-05-01       |  125 |
|       1 | 2020-05-02       |   40 |
|       2 | 2020-05-02       |   50 |
|       3 | 2020-05-02       |   50 |
|       1 | 2020-05-03       |   15 |
|       2 | 2020-05-03       |   25 |
|       3 | 2020-05-03       |   50 |
+---------+------------------+------+

Bonus Läs:Hur man får nya användare per dag i MySQL

Först får vi det senaste datumet för varje användar-ID som använder GROUP BY.

mysql> select user_id,max(transaction_date) from user_data group by user_id;
+---------+-----------------------+
| user_id | max(transaction_date) |
+---------+-----------------------+
|       1 | 2020-05-03            |
|       2 | 2020-05-03            |
|       3 | 2020-05-03            |
+---------+-----------------------+

Nu när vi vet det senaste datumet för varje användar-id, slår vi det här resultatet med vår ursprungliga tabell för att få den senaste posten per användargrupp.

mysql> select user_data.* from user_data,
                (select user_id,max(transaction_date) as transaction_date
                     from user_data
                     group by user_id) max_user
                  where user_data.user_id=max_user.user_id
                  and user_data.transaction_date=max_user.transaction_date;
+---------+------------------+------+
| user_id | transaction_date | sale |
+---------+------------------+------+
|       1 | 2020-05-03       |   15 |
|       2 | 2020-05-03       |   25 |
|       3 | 2020-05-03       |   50 |
+---------+------------------+------+

Förhoppningsvis kan du få sista posten i varje grupp i MySQL

  1. Hur man får antalet bitar i en sträng i MySQL – BIT_LENGTH()

  2. Prestanda överraskningar och antaganden:GROUP BY vs. DISTINCT

  3. CAST() vs TRY_CAST() i SQL Server:Vad är skillnaden?

  4. SQL Server Cursor Types - Framåt endast dynamisk markör | SQL Server Tutorial / TSQL Tutorial