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

Gruppering efter dato, med 0, når count() ikke giver nogen linjer

Da du ikke har datoerne i tabellen, har du brug for en måde at generere dem på. Du kan bruge generate_series funktion:

SELECT * FROM generate_series('2012-01-01'::timestamp, '2012-01-07 23:00', '1 hour') AS ts;
 

Dette vil give resultater som dette:

ts --------------------- 2012-01-01 00:00:00 2012-01-01 01:00:00 2012-01-01 02:00:00 2012-01-01 03:00:00 ... 2012-01-07 21:00:00 2012-01-07 22:00:00 2012-01-07 23:00:00 (168 rows)

Den resterende opgave er at forbinde de to udvalgte ved hjælp af en ydre joinforbindelse som denne :

select extract ( day from ts ) as day, extract ( hour from ts ) as hour,coalesce(count,0) as count from 
(
    SELECT  extract ( day from date ) as day , extract ( hour from date ) as hr ,count(*)
    FROM    sr
    where date>'2012-01-01' and date <'2012-01-07'
    GROUP BY   extract ( day from date ) , extract ( hour from date )
) AS cnt 
 right outer join ( SELECT * FROM generate_series ( '2012-01-01'::timestamp, '2012-01-07 23:00', '1 hour') AS ts ) as dtetable on extract ( hour from ts ) = cnt.hr and extract ( day from ts ) = cnt.day 
 order by day,hour asc;
 


  1. SQL - Sådan bestiller du ved hjælp af Count fra en anden tabel

  2. JPA 2:brug af flere kolonner i fremmednøgler

  3. Konfiguration af et dedikeret netværk til tilgængelighedsgruppekommunikation

  4. Hvordan får man Woocommerce Variation ID?