Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách lấy bản ghi cuối cùng trong mỗi nhóm trong MySQL

Đôi khi bạn có thể cần chọn bản ghi gần đây nhất hoặc lấy bản ghi mới nhất cho mỗi ngày, người dùng, id hoặc bất kỳ nhóm nào khác. Đây là truy vấn SQL để lấy bản ghi cuối cùng trong mỗi nhóm trong MySQL, vì không có hàm tích hợp sẵn cho nó. Bạn cũng có thể sử dụng nó để chọn hàng cuối cùng cho mỗi nhóm trong PostgreSQL, SQL Server &Oracle.

Cách lấy bản ghi cuối cùng trong mỗi nhóm trong MySQL

Dưới đây là các bước để lấy bản ghi cuối cùng trong mỗi nhóm trong MySQL.

Giả sử bạn có bảng product_sales (product, order_date, sale) chứa dữ liệu bán hàng cho nhiều sản phẩm.

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

Phần thưởng đã đọc:Cách đạt được bản ghi với giá trị tối đa trong MySQL

Giả sử bạn muốn có được bản ghi cuối cùng trong mỗi nhóm, tức là cho mỗi sản phẩm. Đầu tiên, chúng tôi sử dụng GROUP BY để lấy ngày gần đây nhất cho mỗi nhóm.

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

Bây giờ chúng tôi đã biết ngày gần đây nhất cho mỗi nhóm, chúng tôi kết hợp kết quả này với bảng gốc của chúng tôi để nhận bản ghi mới nhất theo nhóm ngày.

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

Phần thưởng Đọc:Cách tạo Chế độ xem trong MySQL

Cách chọn Bản ghi Gần đây nhất cho Mỗi Người dùng

Tương tự, bạn có thể chọn bản ghi gần đây nhất cho mỗi người dùng hoặc lấy bản ghi mới nhất cho mỗi id. Giả sử bạn có bảng sau user_data (user_id, transaction_date, sale) với dữ liệu giao dịch của người dùng

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

Phần thưởng đã đọc:Cách thu hút người dùng mới mỗi ngày trong MySQL

Đầu tiên, chúng tôi nhận được ngày mới nhất cho mỗi id người dùng bằng cách sử dụng 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            |
+---------+-----------------------+

Bây giờ chúng tôi đã biết ngày gần đây nhất cho mỗi id người dùng, chúng tôi kết hợp kết quả này với bảng gốc của chúng tôi để nhận bản ghi mới nhất theo nhóm người dùng.

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

Hy vọng rằng bạn có thể nhận được bản ghi cuối cùng trong mỗi nhóm trong 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. Sự khác biệt giữa lược đồ / cơ sở dữ liệu trong MySQL

  2. java.sql.SQLException:Giá trị chuỗi không chính xác:'\ xF0 \ x9F \ x91 \ xBD \ xF0 \ x9F ...'

  3. Khắc phục “ERROR 1054 (42S22):Cột không xác định‘… ’trong‘ mệnh đề thứ tự ”khi sử dụng UNION trong MySQL

  4. Cách tùy chỉnh bản sao lưu MySQL &MariaDB của bạn với ClusterControl

  5. Chiến lược sao lưu và phục hồi MySQL / MariaDB thành công