Đôi khi, bạn có thể cần phải lấy hàng đầu tiên cho mỗi nhóm trong PostgreSQL. Đây có thể là một truy vấn khó khi sử dụng SQL thuần túy. May mắn thay, PostgreSQL cung cấp các chức năng cửa sổ để phân tích dữ liệu như vậy. Dưới đây là cách lấy hàng đầu tiên cho mỗi nhóm trong PostgreSQL.
Cách nhận hàng đầu tiên trên mỗi nhóm trong PostgreSQL
Dưới đây là các bước để lấy hàng đầu tiên cho mỗi nhóm trong PostgreSQL.
Giả sử bạn có bảng sau product_sales chứa bán hàng theo sản phẩm.
postgres=# create table product_sales( product varchar(255), order_date date, sale int); postgres=# 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); postgres=# 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
Giả sử bạn muốn có hàng đầu tiên trong mỗi nhóm, tức là cho mỗi sản phẩm. Bạn có thể dễ dàng nhận được bản ghi đầu tiên cho mỗi nhóm bằng cách sử dụng WINDOW FUNCTION.
Phần thưởng đọc:Cách lấy số hàng trong PostgreSQL
Cách nhận hàng đầu tiên trên mỗi nhóm trong PostgreSQL
Đây là truy vấn SQL để nhận bản ghi đầu tiên cho mỗi nhóm. Đầu tiên, chúng tôi chỉ định số hàng cho mỗi bản ghi trên mỗi nhóm.
postgres=# select *, row_number() over (partition by product order by order_date asc) as row_number from product_sales; product | order_date | sale | row_number ---------+------------+------+------------ A | 2020-05-01 | 250 | 1 A | 2020-05-02 | 450 | 2 A | 2020-05-03 | 150 | 3 B | 2020-05-01 | 350 | 1 B | 2020-05-02 | 650 | 2 B | 2020-05-03 | 250 | 3 C | 2020-05-01 | 1250 | 1 C | 2020-05-02 | 1050 | 2 C | 2020-05-03 | 1850 | 3
Trong truy vấn trên, chúng tôi sử dụng row_number () chức năng gán số hàng cho mỗi bản ghi. Vì chúng ta cần đánh số hàng riêng biệt cho mỗi nhóm, chúng ta sử dụng CHỨC NĂNG CỬA SỔ PHẦN. Chúng tôi yêu cầu Postgresql phân vùng các hàng theo từng sản phẩm , nghĩa là và sắp xếp các hàng cho mỗi nhóm theo order_date
Tiếp theo, chúng ta chỉ cần sử dụng kết quả trên để chọn các hàng có row_number =1
postgres=# select * from ( select *, row_number() over (partition by product order by order_date asc) as row_number from product_sales ) temp where row_number=1; product | order_date | sale | row_number ---------+------------+------+------------ A | 2020-05-01 | 250 | 1 B | 2020-05-01 | 350 | 1 C | 2020-05-01 | 1250 | 1
Truy vấn trên sẽ cung cấp cho bạn bản ghi đầu tiên trong mỗi nhóm.
Phần thưởng đọc:Cách tính toán phần trăm trong PostgreSQL
Cách lấy hàng cuối cùng trên mỗi nhóm trong PostgreSQL
Nếu bạn muốn nhận hàng cuối cùng cho mỗi nhóm trong PostgreSQL, chỉ cần thay đổi thứ tự sắp xếp trong mệnh đề PARTITION của truy vấn trên từ tăng dần đến giảm dần.
postgres=# select * from ( select *, row_number() over (partition by product order by order_date desc) as row_number from product_sales ) temp where row_number=1; product | order_date | sale | row_number ---------+------------+------+------------ A | 2020-05-03 | 150 | 1 B | 2020-05-03 | 250 | 1 C | 2020-05-03 | 1850 | 1
Hy vọng rằng bạn có thể nhận được bản ghi đầu tiên trong mỗi nhóm trong PostgreSQL.
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!