2014-09-26 52 views
0

我有一個ts值爲ts的表,並且在ts中有一個事件發生的次數爲int。 的問題是,如果在一個TS任何情況下,這種TS沒有被記錄在數據庫中,如下面的例子:所有缺少Postgresql完成缺少值的date_trunc(ts,'hour')

ts     | n 
------------------------- 
2014-09-26 01:00:00| 10 
2014-09-26 03:00:00| 12 
2014-09-26 05:00:00| 1 
2014-09-26 06:00:00| 2 
2014-09-26 07:00:00| 4 
2014-09-26 08:00:00| 3 

我需要做的是執行一個查詢,就可以完成ts值(trun at hour)在間隔時間內得到這樣的東西:

ts     | n 
------------------------- 
2014-09-26 01:00:00| 10 
2014-09-26 02:00:00| 0 
2014-09-26 03:00:00| 12 
2014-09-26 04:00:00| 0 
2014-09-26 05:00:00| 1 
2014-09-26 06:00:00| 2 
2014-09-26 07:00:00| 4 
2014-09-26 08:00:00| 3 

感謝您的幫助!

回答

2

你需要生成最小和最大值爲TS之間的所有可能的值的列表,然後外連接,對錶:

with min_max as (
    select min(date_trunc('hour', ts)) as min_hour, 
      max(date_trunc('hour', ts)) as max_hour 
    from the_table 
) 
select s.s, coalesce(t.n, 0) 
from generate_series((select min_hour from min_max), (select max_hour from min_max), interval '1' hour) as s 
    left join the_table t on s.s = date_trunc('hour', t.ts) 
order by s.s; 

如果這並不需要是動態的,並您可以對開始日期和結束日期進行硬編碼,這看起來更容易理解:

select s.s, coalesce(t.n, 0) 
from generate_series(timestamp '2014-09-26 01:00:00', timestamp '2014-09-26 08:00:00', interval '1' hour) as s 
    left join the_table t on s.s = date_trunc('hour', t.ts) 
order by s.s;