sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL -skal vises i GROUP BY-sætningen eller bruges i en aggregeret funktion

Hvis user_id er den PRIMÆRE NØGLE så skal du opgradere PostgreSQL; nyere versioner vil korrekt håndtere gruppering efter den primære nøgle.

Hvis user_id er hverken unik eller den primære nøgle for den pågældende 'gods'-relation, så giver denne forespørgsel ikke meget mening, da PostgreSQL ikke har nogen måde at vide hvilken værdi, der skal returneres for hver kolonne af estates hvor flere rækker deler det samme user_id . Du skal bruge en aggregeret funktion, der udtrykker det, du ønsker, f.eks. min , max , avg , string_agg , array_agg , osv., eller tilføj kolonnen(r) af interesse til GROUP BY .

Alternativt kan du omformulere forespørgslen til at bruge DISTINCT ON og en ORDER BY hvis du virkelig ønsker at vælge en noget vilkårlig række, selvom jeg virkelig tvivler på, at det er muligt at udtrykke det via ActiveRecord.

Nogle databaser - inklusive SQLite og MySQL - vil bare vælge en vilkårlig række. Dette anses for forkert og usikkert af PostgreSQL-teamet, så PostgreSQL følger SQL-standarden og betragter sådanne forespørgsler som fejl.

Hvis du har:

col1    col2
fred    42
bob     9
fred    44
fred    99

og du gør:

SELECT col1, col2 FROM mytable GROUP BY col1;

så er det oplagt, at du skal få rækken:

bob     9

men hvad med resultatet for fred ? Der er ikke et enkelt korrekt svar at vælge, så databasen vil nægte at udføre sådanne usikre forespørgsler. Hvis du ville have det bedste col2 for enhver col1 du skal bruge max samlet:

SELECT col1, max(col2) AS max_col2 FROM mytable GROUP BY col1;


  1. Ydelsesrelaterede rettelser til SQL Server 2012

  2. Hvad er den bedste løsning til pooling af databaseforbindelser i python?

  3. Oracle Date TO_CHAR('Month DD, YYYY') har ekstra mellemrum i sig

  4. Vælg top tre værdier i hver gruppe