sql >> Databáze >  >> RDS >> PostgreSQL

GroupingError:ERROR:sloupec se musí objevit v klauzuli GROUP BY nebo být použit v agregační funkci

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ý pro SELECT 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?



  1. SQL UNION doložka pro začátečníky

  2. Jak použít ANY místo IN v klauzuli WHERE s Rails?

  3. Usnadněte si výkon SQL serveru

  4. SQL Server 2016