我有一个带有ts值的表和一个int表示事件发生在ts的次数。 问题是如果ts中没有事件,则此ts不会记录在DB中,如下例所示:
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),以获得如下内容:
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
感谢您的帮助!
答案 0 :(得分: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;