Sebagai contoh, saya ingin memilih id dengan kelompok tanggal max berdasarkan kategori, hasilnya adalah: 7, 2, 6
id category date
1 a 2013-01-01
2 b 2013-01-03
3 c 2013-01-02
4 a 2013-01-02
5 b 2013-01-02
6 c 2013-01-03
7 a 2013-01-03
8 b 2013-01-01
9 c 2013-01-01
Bolehkah saya tahu cara melakukan ini di PostgreSQL?
sql
postgresql
greatest-n-per-group
pengguna2412043
sumber
sumber
Jawaban:
Ini adalah kasus penggunaan yang sempurna untuk
DISTINCT ON
- ekstensi khusus Postgres dari standarDISTINCT
:SELECT DISTINCT ON (category) id -- , category, date -- any other column (expression) from the same row FROM tbl ORDER BY category, date DESC;
Hati-hati dengan urutan menurun. Jika kolomnya bisa NULL, Anda mungkin ingin menambahkan
NULLS LAST
:DISTINCT ON
sederhana dan cepat. Penjelasan rinci dalam jawaban terkait ini:Untuk tabel besar dengan banyak baris per
category
pertimbangkan pendekatan alternatif:sumber
Coba yang ini:
SELECT t1.* FROM Table1 t1 JOIN ( SELECT category, MAX(date) AS MAXDATE FROM Table1 GROUP BY category ) t2 ON T1.category = t2.category AND t1.date = t2.MAXDATE
Lihat SQLFiddle ini
sumber
Pendekatan lain adalah dengan menggunakan
first_value
fungsi jendela: http://sqlfiddle.com/#!12/7a145/14SELECT DISTINCT first_value("id") OVER (PARTITION BY "category" ORDER BY "date" DESC) FROM Table1 ORDER BY 1;
... meskipun saya curiga saran hims056 biasanya akan bekerja lebih baik jika ada indeks yang sesuai.
Solusi ketiga adalah:
SELECT id FROM ( SELECT id, row_number() OVER (PARTITION BY "category" ORDER BY "date" DESC) AS rownum FROM Table1 ) x WHERE rownum = 1;
sumber
PILIH ID DARI GRUP tbl OLEH cat HAVING MAX (tanggal)
sumber