Bạn không thể kết hợp SELECT *
với GROUP BY some_column
trong Postgres (trừ khi some_column
là PK), bởi vì đó là một mâu thuẫn. Tất cả các cột không được tổng hợp (được sử dụng trong SELECT
, HAVING
hoặc ORDER BY
mệnh đề bên ngoài một hàm tổng hợp) phải nằm trong GROUP BY
list - nơi cột khóa chính có thể thay thế tất cả các cột của bảng. Khác nó là không xác định cái nào giá trị để chọn từ tập hợp tổng hợp.
Theo tài liệu:
Khi
GROUP BY
hiện tại hoặc bất kỳ hàm tổng hợp nào hiện có, không hợp lệ choSELECT
liệt kê các biểu thức để tham chiếu đến các cột không được nhóm ngoại trừ trong các hàm tổng hợp hoặc khi các cột không được nhóm phụ thuộc về mặt chức năng vào các cột được nhóm, vì nếu không sẽ có nhiều hơn một giá trị có thể trả về cho một cột không được nhóm. Tồn tại phụ thuộc chức năng nếu các cột được nhóm (hoặc asubset của chúng) là khóa chính của bảng chứa cột được nhóm chung.
Một RDBMS nhất định khác được biết là chơi những trò bẩn thỉu ở đây và cho phép điều này và chọn các giá trị tùy ý ...
Có vẻ như bạn muốn có một danh sách các bệnh nhân duy nhất đã nhận xét, với mới nhất nhận xét từng. Cách đơn giản nhất trong Postgres là DISTINCT ON
:
SELECT DISTINCT ON (patient_id) *
FROM comments
WHERE clinician_id = $1
ORDER BY patient_id, created_at DESC NULLS LAST;
Nhưng điều này sẽ không bay với SQLite - điều này không nên có trong vòng lặp để bắt đầu bằng:
- Giải pháp Ruby chung cho SQLite3 "LIKE" hoặc PostgreSQL "ILIKE"?
NULLS LAST
chỉ có liên quan nếu created_at
có thể là NULL:
- PostgreSQL sắp xếp theo datetime asc, null trước?
Chi tiết về DISTINCT ON
:
- Chọn hàng đầu tiên trong mỗi GROUP BY nhóm?