Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak uzyskać ostatni rekord w każdej grupie w MySQL?

Czasami może zajść potrzeba wybrania najnowszego rekordu lub pobrania najnowszego rekordu dla każdej daty, użytkownika, identyfikatora lub dowolnej innej grupy. Oto zapytanie SQL, aby uzyskać ostatni rekord w każdej grupie w MySQL, ponieważ nie ma dla niego wbudowanej funkcji. Możesz go również użyć do wybrania ostatniego wiersza dla każdej grupy w PostgreSQL, SQL Server i Oracle.

Jak uzyskać ostatni rekord w każdej grupie w MySQL

Oto kroki, aby uzyskać ostatni rekord w każdej grupie w MySQL.

Załóżmy, że masz tabelę product_sales(product, order_date,sale) który zawiera dane sprzedaży dla wielu produktów.

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

Przeczytaj bonus:Jak uzyskać rekord z maksymalną wartością w MySQL

Powiedzmy, że chcesz uzyskać ostatni rekord w każdej grupie, to znaczy dla każdego produktu. Najpierw używamy GROUP BY, aby uzyskać najnowszą datę dla każdej grupy.

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

Teraz, gdy znamy najnowszą datę dla każdej grupy, łączymy ten wynik z naszą oryginalną tabelą, aby uzyskać najnowszy rekord według grupy dat.

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

Przeczytaj bonus:Jak utworzyć widok w MySQL

Jak wybrać najnowszy rekord dla każdego użytkownika

Podobnie możesz wybrać najnowszy rekord dla każdego użytkownika lub uzyskać najnowszy rekord dla każdego identyfikatora. Załóżmy, że masz następującą tabelę dane_użytkownika(identyfikator_użytkownika,data_transakcji,wyprzedaż) z danymi transakcji użytkownika

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

Przeczytaj bonus:Jak zdobywać nowych użytkowników dziennie w MySQL

Najpierw otrzymujemy najnowszą datę dla każdego identyfikatora użytkownika za pomocą funkcji 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            |
+---------+-----------------------+

Teraz, gdy znamy najnowszą datę dla każdego identyfikatora użytkownika, łączymy ten wynik z naszą oryginalną tabelą, aby uzyskać najnowszy rekord według grupy użytkowników.

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

Mam nadzieję, że możesz uzyskać ostatni rekord w każdej grupie w MySQL

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa funkcja TRIM() w MySQL

  2. Dlaczego szacowana liczba wierszy jest bardzo różna w wynikach phpmyadmina?

  3. Co monitorować w MySQL 8.0

  4. Escape string Python dla MySQL

  5. Na zduplikowanym kluczu zignorować?