PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Grupowanie według daty, z 0, gdy count() nie daje żadnych wierszy

Biorąc pod uwagę, że nie masz dat w tabeli, potrzebujesz sposobu na ich wygenerowanie. Możesz użyć generate_series funkcja:

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

To da takie wyniki:

         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)

Pozostałe zadanie polega na połączeniu dwóch wybranych za pomocą sprzężenia zewnętrznego w ten sposób:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sprawdź, czy wartość istnieje w tablicy Postgres

  2. Uruchamianie wielu instancji PostgreSQL na jednym hoście

  3. Jak usunąć nieużywane sekwencje?

  4. Funkcja Postgres End Loop i błąd powrotu

  5. Gdzie umieścić zależność c3p0 w kontenerze Tomcat