PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara Mendapatkan Baris Pertama Per Grup di PostgreSQL

Terkadang, Anda mungkin perlu mendapatkan baris pertama per grup di PostgreSQL. Ini bisa menjadi kueri yang sulit menggunakan SQL biasa. Untungnya, PostgreSQL menawarkan fungsi jendela untuk analisis data semacam itu. Berikut cara mendapatkan baris pertama per grup di PostgreSQL.

Cara Mendapatkan Baris Pertama Per Grup di PostgreSQL

Berikut adalah langkah-langkah untuk mendapatkan baris pertama per grup di PostgreSQL.

Katakanlah Anda memiliki tabel berikut produk_penjualan yang berisi penjualan produk.

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

Katakanlah Anda ingin mendapatkan baris pertama di setiap grup, yaitu untuk setiap produk. Anda dapat dengan mudah mendapatkan catatan pertama untuk setiap grup menggunakan FUNGSI WINDOW.

Bonus Baca :Cara Mendapatkan Nomor Baris di PostgreSQL

Cara Mendapatkan Baris Pertama Per Grup di PostgreSQL

Berikut query SQL untuk mendapatkan record pertama per grup. Pertama, kami menetapkan nomor baris untuk setiap record per grup.

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

Dalam kueri di atas, kami menggunakan row_number() berfungsi untuk menetapkan nomor baris untuk setiap record. Karena, kita membutuhkan penomoran baris yang terpisah untuk setiap grup, kita menggunakan PARTITION WINDOW FUNCTION. Kami memberi tahu Postgresql untuk Mempartisi baris menurut setiap produk , yaitu, dan urutkan baris untuk setiap grup menurut tanggal_pesanan

Selanjutnya, kita hanya perlu menggunakan hasil di atas untuk memilih baris di mana 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

Kueri di atas akan memberi Anda catatan pertama di setiap grup.

Bonus Baca :Cara Menghitung Persentil di PostgreSQL

Cara Mendapatkan Baris Terakhir Per Grup di PostgreSQL

Jika Anda ingin mendapatkan baris terakhir per grup di PostgreSQL, cukup ubah urutan pengurutan dalam klausa PARTITION dari kueri di atas dari menaik menjadi menurun.

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

Mudah-mudahan, Anda bisa mendapatkan rekor pertama di setiap grup di PostgreSQL.

Ubiq memudahkan untuk memvisualisasikan data dalam hitungan menit, dan memantau di dasbor waktu nyata. Cobalah Hari ini!

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Performa TPC-H sejak PostgreSQL 8.3

  2. Periksa apakah database ada di PostgreSQL menggunakan shell

  3. tidak bisa membuat sisipan PostgreSQL sederhana berfungsi

  4. Apakah ada hit kinerja menggunakan tipe data desimal (MySQL/Postgres)

  5. Menyiapkan Django dan PostgreSQL pada dua instans EC2 yang berbeda