PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Групиране по дата, с 0, когато count() не дава редове

Като се има предвид, че нямате датите в таблицата, имате нужда от начин да ги генерирате. Можете да използвате generate_series функция:

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

Това ще доведе до резултати като тези:

         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)

Оставащата задача е да се съединят двата избрани елемента с помощта на външно съединение като това:

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. Изтриване на записи от отдалечена postgresql база данни с помощта на локално предоставен списък

  2. Как да стартирате PostgreSQL като услуга в Windows?

  3. Кой е подходящ тип данни за съхраняване на часова зона?

  4. Now() без часова зона

  5. използвайки копие в postgresql?