Đôi khi bạn có thể cần phải có hàng đầu tiên trong mỗi nhóm hoặc hàng tối thiểu cho mỗi nhóm. Dưới đây là cách lấy bản ghi đầu tiên trong mỗi nhóm trong MySQL. Bạn cũng có thể sử dụng truy vấn SQL này để có được hàng đầu tiên trong mỗi nhóm trong MySQL, PostgreSQL, SQL Server &Oracle. Bạn có thể sử dụng nó để chọn 1 hàng trên cùng cho mỗi nhóm.
Cách lấy bản ghi đầu tiên trong mỗi nhóm trong MySQL
Dưới đây là các bước để lấy bản ghi đầu tiên 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 kỷ lục đầu tiên 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 để biết ngày đầu tiên cho mỗi nhóm.
mysql> select product,min(order_date) from product_sales group by product; +---------+-----------------+ | product | max(order_date) | +---------+-----------------+ | A | 2020-05-01 | | B | 2020-05-01 | | C | 2020-05-01 | +---------+-----------------+
Bây giờ chúng ta đã biết ngày đầu tiên cho mỗi nhóm, chúng ta kết hợp kết quả này với bảng gốc của chúng ta để có được bản ghi đầu tiên theo nhóm ngày.
mysql> select product_sales.* from product_sales, (select product,min(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 | 250 | | B | 2020-05-03 | 350 | | C | 2020-05-03 | 1250 | +---------+------------+------+
Nếu bạn muốn lấy bản ghi cuối cùng hoặc gần đây nhất cho mỗi nhóm, hãy sử dụng hàm MAX thay vì hàm MIN ở trên.
Phần thưởng đã đọc:Cách đạt được bản ghi cuối cùng trong mỗi nhóm
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 đầu tiên cho mỗi người dùng hoặc lấy bản ghi cũ 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 nhận bản ghi 15 ngày qua trong MySQL
Đầu tiên, chúng tôi nhận được ngày đầu tiên cho mỗi id người dùng bằng cách sử dụng GROUP BY.
mysql> select user_id,min(transaction_date) from user_data group by user_id; +---------+-----------------------+ | user_id | min(transaction_date) | +---------+-----------------------+ | 1 | 2020-05-01 | | 2 | 2020-05-01 | | 3 | 2020-05-01 | +---------+-----------------------+
Bây giờ chúng tôi đã biết ngày cũ 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 đầu tiên theo nhóm người dùng.
mysql> select user_data.* from user_data, (select user_id,min(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-01 | 25 | | 2 | 2020-05-01 | 35 | | 3 | 2020-05-01 | 125 | +---------+------------------+------+
Hy vọng rằng bạn có thể nhận được bản ghi đầu tiên trong mỗi nhóm trong MySQL.
Ubiq giúp dễ dàng trực quan hóa dữ liệu trong vài phút và theo dõi trong trang tổng quan thời gian thực. Thử nó ngay hôm nay!