Saya tahu ini adalah pertanyaan yang agak lama, tetapi saya baru saja membaca contoh kecil di kepala saya yang membantu saya memahami mengapa Postgres memiliki batasan yang tampaknya aneh ini pada kolom SELECT DISTINCT / ORDER BY.
Bayangkan Anda memiliki data berikut di tabel Rsvp Anda:
event_id | start_time
----------+------------------------
0 | Mar 17, 2013 12:00:00
1 | Jan 1, 1970 00:00:00
1 | Aug 21, 2013 16:30:00
2 | Jun 9, 2012 08:45:00
Sekarang Anda ingin mengambil daftar event_ids yang berbeda, diurutkan berdasarkan start_times masing-masing. Tapi di mana harus 1
Pergilah? Haruskah itu datang lebih dulu, karena satu tupel dimulai pada 1 Januari 1970, atau haruskah itu menjadi yang terakhir karena 21 Agustus 2013?
Karena sistem basis data tidak dapat membuat keputusan itu untuk Anda dan sintaks kueri tidak dapat bergantung pada data aktual yang mungkin dioperasikannya (dengan asumsi event_id
unik), kami dibatasi untuk memesan hanya dengan kolom dari SELECT
klausa.
Adapun pertanyaan aktual - alternatif untuk jawaban Matthew adalah menggunakan fungsi agregat seperti MIN
atau MAX
untuk pengurutan:
SELECT event_id
FROM Rsvp
GROUP BY event_id
ORDER BY MIN(start_time)
Pengelompokan dan agregasi eksplisit pada start_time
mengizinkan database untuk membuat urutan tupel hasil yang tidak ambigu. Namun perhatikan, keterbacaan itu jelas merupakan masalah dalam kasus ini;)