【发布时间】:2015-10-21 01:04:43
【问题描述】:
使用 Postgresql 9.4,我正在尝试对时间序列日志数据进行查询,每当值更新时(不是按计划)记录新值。日志可以在任何地方更新,从一分钟几次到一天一次。
我需要查询来完成以下操作:
- 只需选择时间戳范围的第一个条目即可过滤太多数据
- 使用最后读数作为日志值填写稀疏数据。例如,如果我按小时对数据进行分组,并且在上午 8 点有一个日志值为 10 的条目。那么下一个条目要到上午 11 点,日志值为 15,我希望查询返回类似这个:
Timestamp | Value
2015-07-01 08:00 | 10
2015-07-01 09:00 | 10
2015-07-01 10:00 | 10
2015-07-01 11:00 | 15
我有一个查询可以实现其中的第一个目标:
with time_range as (
select hour
from generate_series('2015-07-01 00:00'::timestamp, '2015-07-02 00:00'::timestamp, '1 hour') as hour
),
ranked_logs as (
select
date_trunc('hour', time_stamp) as log_hour,
log_val,
rank() over (partition by date_trunc('hour', time_stamp) order by time_stamp asc)
from time_series
)
select
time_range.hour,
ranked_logs.log_val
from time_range
left outer join ranked_logs on ranked_logs.log_hour = time_range.hour and ranked_logs.rank = 1;
但我不知道如何填写没有价值的nulls。我尝试使用 Postgresql 的 Window 函数的 lag() 功能,但是当连续有多个 null 时它不起作用。
这是一个演示该问题的 SQLFiddle: http://sqlfiddle.com/#!15/f4d13/5/0
【问题讨论】:
标签: sql postgresql