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 BYada, atau ada fungsi agregat apa pun, itu tidak valid untukSELECTdaftar 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?