问题描述
为简单起见:我们有一个包含两列的表,value
和date
。
每秒钟都会收到一个新数据,我们希望将其保存为时间戳。由于数据可能相似,因此为了降低使用率,如果数据与上一个条目相同,我们将不保存它。
问题:假设在24小时内收到了相同的值,则仅保存第一对value
和date
。如果我们要查询“最近1小时的平均值”,是否有一种方法可以让数据库(PostgreSQL)看到最近一小时没有保存任何值并搜索最后一个现有的值输入?
解决方法
这并不像看起来那样容易,并且它不仅仅在于在最近一小时内没有可用数据时检索最新数据点。您需要计算平均值,因此需要重建该时间段的时间序列数据(每秒一次),以最新的可用数据点填补空白。
我认为最简单的方法是generate_series()
建立行,然后进行横向联接以恢复数据:
select avg(d.value) avg_last_hour
from generate_series(now() - interval '1 hour',now(),'1 second') t(ts)
cross join lateral (
select d.*
from data d
where d.date <= t.ts
order by d.date desc
limit 1
) t
,
嗯。 。 。如果您只想获取数据中最近一小时的平均值,则可以使用:
select date_trunc('hour',date) as ddhh,avg(value)
from t
group by ddhh
order by ddhh desc
limit 1;
如果要收集大量数据,则在date
上添加索引并使用以下方法可能会更快:
select avg(value)
from t
where date >= date_trunc('hour',(select max(t2.date) from t t2));