Anda tidak dapat menggabungkan SELECT *
dengan GROUP BY some_column
di Postgres (kecuali some_column
adalah PK), karena itu kontradiksi. Semua kolom non-agregat (digunakan di SELECT
, HAVING
atau ORDER BY
klausa di luar fungsi agregat) harus dalam GROUP BY
list - di mana kolom kunci utama dapat menggantikan semua kolom tabel. Jika tidak, tidak ditentukan yang nilai untuk dipilih dari kumpulan agregat.
Per dokumentasi:
Ketika
GROUP BY
ada, atau ada fungsi agregat apa pun, itu tidak valid untukSELECT
daftar ekspresi untuk merujuk ke kolom yang tidak dikelompokkan kecuali dalam fungsi agregat atau ketika kolom yang tidak dikelompokkan secara fungsional bergantung pada kolom yang dikelompokkan, karena jika tidak, akan ada lebih dari satu nilai yang mungkin untuk dikembalikan untuk kolom yang tidak dikelompokkan. Ketergantungan fungsional ada jika kolom yang dikelompokkan (atau bagiannya) adalah kunci utama dari tabel yang berisi kolom yang tidak dikelompokkan.
RDBMS tertentu lainnya diketahui memainkan trik kotor di sini dan mengizinkan ini dan memilih nilai arbitrer...
Anda sepertinya menginginkan daftar pasien unik yang telah berkomentar, dengan terbaru komentar masing-masing. Cara paling sederhana di Postgres adalah dengan DISTINCT ON
:
SELECT DISTINCT ON (patient_id) *
FROM comments
WHERE clinician_id = $1
ORDER BY patient_id, created_at DESC NULLS LAST;
Tapi ini tidak akan berhasil dengan SQLite - yang seharusnya tidak ada dalam lingkaran untuk memulai:
- Solusi Ruby generik untuk SQLite3 "LIKE" atau PostgreSQL "ILIKE"?
NULLS LAST
hanya relevan jika created_at
bisa NULL:
- Urutkan PostgreSQL berdasarkan datetime asc, null dulu?
Detail untuk DISTINCT ON
:
- Pilih baris pertama di setiap grup GROUP BY?