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

Hvordan tæller man rækker, der opfylder en betingelse i Redshift/Postgres?

For det første er problemet, du har her, at det, du siger, er "Hvis karakteren er mindre end 70, er værdien af ​​dette kasusudtryk count(rank). Ellers er værdien af ​​dette udtryk count(rank) ." Så i begge tilfælde får du altid den samme værdi.

SELECT 
    CASE
        WHEN grade < 70 THEN COUNT(rank)
        ELSE COUNT(rank)
    END
FROM
   grades

count() tæller kun værdier, der ikke er nul, så typisk er det mønster, du vil se for at opnå det, du prøver, dette:

SELECT 
    count(CASE WHEN grade < 70 THEN 1 END) as grade_less_than_70,
    count(CASE WHEN grade >= 70 and grade < 80 THEN 1 END) as grade_between_70_and_80
FROM
   grades

På den måde vil kasusudtrykket kun evalueres til 1, når testudtrykket er sandt og vil ellers være nul. Så vil count() kun tælle de ikke-null-forekomster, dvs. når testudtrykket er sandt, hvilket burde give dig det, du har brug for.

Rediger:Som en sidebemærkning skal du bemærke, at dette er nøjagtigt det samme som, hvordan du oprindeligt havde skrevet dette ved hjælp af count(if(test, true-value, false-value)) , kun omskrevet som count(case when test then true-value end) (og null er standen i falsk-værdi siden en else blev ikke leveret til sagen).

Edit:postgres 9.4 blev udgivet et par måneder efter denne originale udveksling. Den version introducerede aggregerede filtre, som kan få scenarier som dette til at se lidt pænere og klarere ud. Dette svar får stadig nogle lejlighedsvise opstemmer, så hvis du er faldet over her og bruger en nyere postgres (dvs. 9.4+), vil du måske overveje denne tilsvarende version:

SELECT
    count(*) filter (where grade < 70) as grade_less_than_70,
    count(*) filter (where grade >= 70 and grade < 80) as grade_between_70_and_80
FROM
   grades


  1. hvordan gemmer man PostgreSQL jsonb ved hjælp af SpringBoot + JPA?

  2. Vedhæft en database i SQLite

  3. serie i postgres bliver øget, selvom jeg tilføjede om konflikt gør ingenting

  4. MySQL-serveren er gået væk - på præcis 60 sekunder