SELECT *
nelze kombinovat s GROUP BY some_column
v Postgresu (pokud není some_column
je PK), protože to je rozpor. Všechny neagregované sloupce (používané v SELECT
, HAVING
nebo ORDER BY
klauzule mimo agregační funkci) musí být v GROUP BY
seznam - kde sloupec primárního klíče může nahradit všechny sloupce tabulky. Jinak není definováno které hodnotu, kterou chcete vybrat z agregované sady.
Podle dokumentace:
Když
GROUP BY
je přítomen nebo jsou přítomny jakékoli agregační funkce, není platný proSELECT
seznam výrazů, které odkazují na neseskupené sloupce, s výjimkou agregačních funkcí nebo když neseskupený sloupec funkčně závisí na seskupených sloupcích, protože jinak by pro neseskupený sloupec bylo možné vrátit více než jednu hodnotu. Funkční závislost existuje, pokud jsou seskupené sloupce (nebo jejich podmnožina) primárním klíčem tabulky obsahující neseskupený sloupec.
Je známo, že některé další RDBMS zde hrají špinavé triky a umožňují to a vybírají libovolné hodnoty...
Zdá se, že chcete seznam unikátních pacientů, kteří okomentovali, s nejnovějším každý komentovat. Nejjednodušší způsob v Postgres je s DISTINCT ON
:
SELECT DISTINCT ON (patient_id) *
FROM comments
WHERE clinician_id = $1
ORDER BY patient_id, created_at DESC NULLS LAST;
Ale to nebude létat s SQLite - což by nemělo být ve smyčce pro začátek:
- Obecné řešení Ruby pro SQLite3 „LIKE“ nebo PostgreSQL „ILIKE“?
NULLS LAST
je relevantní pouze v případě, že created_at
může být NULL:
- PostgreSQL řazení podle datetime asc, nejprve null?
Podrobnosti pro DISTINCT ON
:
- Vybrat první řádek v každé skupině GROUP BY?