Postgresql使用缺失值完成date_trunc(ts,' hour')

时间:2014-09-26 19:18:34

标签: postgresql datetime

我有一个带有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

感谢您的帮助!

1 个答案:

答案 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;