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

Cách nhận bản ghi đầu tiên trong mỗi nhóm trong MySQL

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm kiếm toàn văn bản trong MySQL:Tốt, xấu và xấu

  2. Làm thế nào để bạn tham gia vào cùng một bàn, hai lần, trong mysql?

  3. làm thế nào để truyền hệ thập lục phân thành varchar (datetime)?

  4. LỖI 2003 (HY000):Không thể kết nối với máy chủ MySQL trên '127.0.0.1' (111)

  5. Cách bật nhật ký truy vấn chậm MySQL trong MySQL