在SQL中仅保存唯一的数据点

问题描述

为简单起见:我们有一个包含两列的表,valuedate

每秒钟都会收到一个新数据,我们希望将其保存为时间戳。由于数据可能相似,因此为了降低使用率,如果数据与上一个条目相同,我们将不保存它。

问题:假设在24小时内收到了相同的值,则仅保存第一对valuedate。如果我们要查询“最近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));

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...