Pertanyaan PostgreSQL DISTINCT: Mengendalikan ORDER BY Discrepancies
Klausa DISTINCT ON
PostgreSQL boleh mengemukakan cabaran apabila ungkapan DISTINCT ON
tidak sejajar dengan kriteria ORDER BY
awal. Ini kerana DISTINCT ON
memilih baris pertama setiap kumpulan yang ditakrifkan oleh ungkapan DISTINCT ON
, seperti yang ditentukan oleh klausa ORDER BY
. Pesanan yang tidak sepadan membawa kepada ralat.
Untuk membetulkan ini, ungkapan DISTINCT ON
lazimnya harus menjadi kriteria utama dalam klausa ORDER BY
. Walau bagaimanapun, jika pesanan yang berbeza diutamakan, pendekatan alternatif tersedia.
Kaedah Alternatif untuk Pemilihan Baris Unik
Daripada bergantung semata-mata pada DISTINCT ON
, pertimbangkan strategi ini untuk mendapatkan semula baris "atas" daripada setiap kumpulan berdasarkan susunan yang dipilih:
Kaedah 1: N Terhebat Setiap Kumpulan
Pendekatan ini menggunakan subkueri untuk mengenal pasti nilai maksimum (atau minimum) dalam setiap kumpulan dan kemudian bergabung kembali ke jadual asal untuk mendapatkan semula baris yang sepadan. Berikut ialah contoh:
<code class="language-sql">SELECT t1.* FROM purchases t1 JOIN ( SELECT address_id, max(purchased_at) as max_purchased_at FROM purchases WHERE product_id = 1 GROUP BY address_id ) t2 ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at ORDER BY t1.purchased_at DESC;</code>
Kaedah 2: Bersarang DISTINCT ON
Pertanyaan
Penyelesaian khusus PostgreSQL yang lebih ringkas menggunakan pertanyaan bersarang:
<code class="language-sql">SELECT * FROM ( SELECT DISTINCT ON (address_id) * FROM purchases WHERE product_id = 1 ORDER BY address_id, purchased_at DESC ) t ORDER BY purchased_at DESC;</code>
Kaedah ini memberikan fleksibiliti dalam memilih baris unik sambil mengekalkan kawalan ke atas pesanan akhir, walaupun ia berbeza daripada kriteria pengelompokan. Pilih kaedah yang paling sesuai dengan keperluan khusus anda dan struktur data.
Atas ialah kandungan terperinci Bagaimana untuk Menanyakan Baris DISTINCT dalam PostgreSQL dengan ORDER BY Kriteria yang berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!