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

在SQL中仅保存唯一的数据点,sql,postgresql,datetime,average,lateral-join,Sql,Postgresql,Datetime,Average,Lateral Join,为了简单起见:我们有一个包含两列的表,分别是value和date 每秒钟都会收到一个新数据,我们希望用它的时间戳保存它。由于数据可以相似,为了降低使用率,如果数据与前面的条目相同,我们不保存它 问题:如果在24小时内收到相同的值,则只保存第一个值和日期对。如果我们想查询“过去1小时内的平均值”,有没有办法让db PostgreSQL查看过去一小时内没有保存任何值并搜索最后一个现有值条目?这并不像看上去那么容易,而且这不仅仅是在过去一小时内没有可用数据时检索最新数据点。您希望计算平均值,因此需要每

为了简单起见:我们有一个包含两列的表,分别是value和date

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


问题:如果在24小时内收到相同的值,则只保存第一个值和日期对。如果我们想查询“过去1小时内的平均值”,有没有办法让db PostgreSQL查看过去一小时内没有保存任何值并搜索最后一个现有值条目?

这并不像看上去那么容易,而且这不仅仅是在过去一小时内没有可用数据时检索最新数据点。您希望计算平均值,因此需要每秒重建时段的时间序列数据,用最新的可用数据点填补空白

我认为最简单的方法是生成_系列来构建行,然后横向连接来恢复数据:

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;
如果收集了大量数据,则添加日期索引并使用以下方法可能会更快:


样本数据、期望的结果和清晰的解释会有所帮助。例如,24小时是日历日期还是相对于传入数据的时间。
select avg(value)
from t
where date >= date_trunc('hour', (select max(t2.date) from t t2));