sql >> Database >  >> RDS >> PostgreSQL

Groepeer en tel gebeurtenissen per tijdsinterval, plus lopend totaal

Gebruik date_trunc() om tijdstempels af te kappen tot de maand en zowel jaar als maand in één kolom te dekken. U kunt to_char() . gebruiken om dat op elke gewenste manier te formatteren.

Om de lopende telling te krijgen die u in uw aanvullende vraag noemt, voegt u een vensterfunctie :

SELECT to_char(date_trunc('month', period_start), 'Mon YYYY') AS month
     , count(*) AS month_ct
     , sum(count(*)) OVER (ORDER BY date_trunc('month', period_start)) AS running_ct
FROM   activity_log
WHERE  action = 'create_entry'
GROUP  BY date_trunc('month', period_start);

sqlfiddle voor Psotgres 9.6
db<>fiddle hier voor Postgres 12

Vensterfuncties worden na . uitgevoerd aggregatiefuncties, zodat we een vensterfunctie op een aggregaat op hetzelfde queryniveau kunnen uitvoeren. Gerelateerd:

Het is essentieel om dezelfde basisuitdrukking te gebruiken in de vensterfunctie en in GROUP BY :date_trunc('month', period_start) .



  1. Een datumbereik herhalen in PL/SQL

  2. verander datumnotatie van char

  3. MySQL UPDATE met IF-voorwaarde

  4. Hoe maak je een soort iterator (of kunstmatige id) voor een bepaalde reeks rijen?