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

Làm thế nào để có được hàng đầu tiên trên mỗi nhóm trong PostgreSQL

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bản sao Londiste với PostgreSQL 9.0

  2. Lỗi:không tìm thấy tệp thi hành pg_config khi cài đặt psycopg2 trên Alpine trong Docker

  3. Thu thập các khóa JSON đệ quy trong Postgres

  4. Máy chủ có đang chạy trên máy chủ localhost (::1) và chấp nhận kết nối TCP / IP trên cổng 5432 không?

  5. Cách thêm số ngày trong datetime postgresql