2014-09-26 48 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;