Kueri terpendek (dan mungkin tercepat) adalah dengan DISTINCT ON
, ekstensi PostgreSQL dari standar SQL DISTINCT
klausa:
SELECT DISTINCT ON (1)
id, count, year
FROM tbl
ORDER BY 1, 2 DESC, 3;
Angka mengacu pada posisi ordinal di SELECT
daftar. Anda dapat mengeja nama kolom untuk kejelasan:
SELECT DISTINCT ON (id)
id, count, year
FROM tbl
ORDER BY id, count DESC, year;
Hasilnya diurutkan berdasarkan id
dll. yang mungkin diterima atau tidak. Ini lebih baik daripada "tidak terdefinisi" dalam hal apa pun.
Ini juga memutuskan ikatan (ketika beberapa tahun berbagi jumlah maksimum yang sama) dengan cara yang ditentukan dengan baik:pilih tahun paling awal. Jika Anda tidak peduli, masukkan year
dari ORDER BY
. Atau pilih tahun terakhir dengan year DESC
.
Untuk banyak baris per id
, teknik kueri lainnya (jauh) lebih cepat. Lihat:
- Pilih dulu baris di setiap grup GROUP BY?
- Optimalkan kueri GROUP BY untuk mengambil baris terbaru per pengguna