Đô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