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

PostgreSQL Where count condition

SELECT a.license_id, a.limit_call
     , count(b.license_id) AS overall_count
FROM   "License"  a
LEFT   JOIN "Log" b USING (license_id)
WHERE  a.license_id = 7 
GROUP  BY a.license_id  -- , a.limit_call  -- add in old versions
HAVING a.limit_call > count(b.license_id)

Siden Postgres 9.1 dækker den primære nøgle alle kolonner i en tabel i GROUP BY klausul. I ældre versioner skal du tilføje a.limit_call til GROUP BY liste. Udgivelsesbemærkningerne til 9.1:

Tillad ikke-GROUP BY kolonner i forespørgselsmållisten, når primærnøglen er angivet i GROUP BY klausul

Yderligere læsning:

  • Hvorfor kan jeg ikke ekskludere afhængige kolonner fra "GROUP BY", når jeg samler med en nøgle?

Den tilstand, du havde i WHERE klausul skal flyttes til HAVING klausul, da den refererer til resultatet af en aggregeret funktion (efter WHERE er blevet anvendt). Og du kan ikke henvise til outputkolonner (kolonnealiaser) i HAVING klausul, hvor du kun kan referere til inputkolonner. Så du skal gentage udtrykket. Manualen:

En outputkolonnes navn kan bruges til at henvise til kolonnens værdi iORDER BY og GROUP BY klausuler, men ikke i WHERE eller HAVING klausuler; der skal du i stedet skrive udtrykket ud.

Jeg vendte rækkefølgen af ​​tabeller i FROM klausul og ryddede lidt op i syntaksen for at gøre det mindre forvirrende. USING er kun en notationsbekvemmelighed her.

Jeg brugte LEFT JOIN i stedet for JOIN , så du udelukker ikke licenser uden nogen log overhovedet.

Kun værdier, der ikke er nul, tælles af count() . Da du vil tælle relaterede poster i tabel "Log" det er mere sikkert og lidt billigere at bruge count(b.license_id) . Denne kolonne bruges i joinforbindelsen, så vi skal ikke bekymre os om kolonnen kan være null eller ej.
count(*) er endnu kortere og lidt hurtigere, endnu. Hvis du ikke har noget imod at få en optælling på 1 for 0 rækker i den venstre tabel, brug det.

Bortset fra:Jeg vil fraråde ikke at bruge blandede store og små bogstaver i Postgres hvis muligt. Meget fejltilbøjelig.



  1. TSQL PIVOT FLERE KOLONNER

  2. Kom godt i gang med GearHost til MySQL-databaseudvikling

  3. Returner oplysninger om operativsystemversion i SQL Server med sys.dm_os_host_info Dynamic Management View

  4. Brug af en variabel periode i et interval i Postgres