sql >> Database >  >> RDS >> PostgreSQL

GroupingError:ERROR:kolom moet voorkomen in de GROUP BY-clausule of worden gebruikt in een aggregatiefunctie

U kunt SELECT * niet combineren met GROUP BY some_column in Postgres (tenzij some_column is de PK), want dat is een contradictie. Alle niet-geaggregeerde kolommen (gebruikt in de SELECT , HAVING of ORDER BY clausule buiten een aggregatiefunctie) moet in de GROUP BY . staan lijst - waarbij de primaire sleutelkolom alle kolommen van een tabel kan vervangen. Anders is het niet gedefinieerd welke waarde om uit de geaggregeerde set te kiezen.

Per documentatie:

Wanneer GROUP BY aanwezig is, of er zijn geaggregeerde functies aanwezig, het is niet geldig voor de SELECT lijstexpressies om naar niet-gegroepeerde kolommen te verwijzen, behalve binnen geaggregeerde functies of wanneer de niet-gegroepeerde kolom functioneel afhankelijk is van de gegroepeerde kolommen, aangezien er anders meer dan één mogelijke waarde zou zijn om te retourneren voor een niet-gegroepeerde kolom. Er is sprake van een functionele afhankelijkheid als de gegroepeerde kolommen (of een subset daarvan) de primaire sleutel zijn van de tabel die de niet-gegroepeerde kolom bevat.

Het is bekend dat een bepaald ander RDBMS hier vuile trucs uithaalt en dit toestaat en willekeurige waarden kiest...

Het lijkt erop dat u een lijst wilt van unieke patiënten die hebben gereageerd, met de laatste commentaar elk. De eenvoudigste manier in Postgres is met DISTINCT ON :

SELECT DISTINCT ON (patient_id) *
FROM   comments
WHERE  clinician_id = $1
ORDER  BY patient_id, created_at DESC NULLS LAST;

Maar dit zal niet vliegen met SQLite - wat om te beginnen niet in de lus zou moeten zitten:

  • Generieke Ruby-oplossing voor SQLite3 "LIKE" of PostgreSQL "ILIKE"?

NULLS LAST is alleen relevant als created_at kan NULL zijn:

  • PostgreSQL sorteren op datum/tijd asc, eerst null?

Details voor DISTINCT ON :

  • Selecteer de eerste rij in elke GROUP BY-groep?



  1. Hoe REVERSE() werkt in MariaDB

  2. Verbinden door eerdere equivalenten voor MySQL

  3. Introductie van op agenten gebaseerde databasebewaking met ClusterControl 1.7

  4. Is er een hash-functie in PL/SQL?