Postgresql SQL GROUP BY具有任意精度的时间间隔(低至毫秒)

前端之家收集整理的这篇文章主要介绍了Postgresql SQL GROUP BY具有任意精度的时间间隔(低至毫秒)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的测量数据存储在以下结构中:
CREATE TABLE measurements(
measured_at TIMESTAMPTZ,val INTEGER
);

我已经知道使用了

(a)date_trunc(‘hour’,measured_at)

(b)generate_series

我可以通过以下方式汇总我的数据:

microseconds,milliseconds
.
.
.

但是可以将数据汇总5分钟,还是说任意的秒数?是否可以将测量数据聚合任意的秒数?

我需要通过不同时间分辨率汇总的数据将其馈送到FFT或AR模型中,以便查看可能的季节性。

您可以通过添加generate_series()创建的间隔来生成“buckets”表。此sql语句将在数据中生成第一天五分钟存储桶(min(measured_at)的值)表。
select 
  (select min(measured_at)::date from measurements) + ( n    || ' minutes')::interval start_time,(select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
from generate_series(0,(24*60),5) n

将该语句包含在通用表表达式中,您可以将其加入并分组,就像它是基表一样。

with five_min_intervals as (
  select 
    (select min(measured_at)::date from measurements) + ( n    || ' minutes')::interval start_time,(select min(measured_at)::date from measurements) + ((n+5) || ' minutes')::interval end_time
  from generate_series(0,5) n
)
select f.start_time,f.end_time,avg(m.val) avg_val 
from measurements m
right join five_min_intervals f 
        on m.measured_at >= f.start_time and m.measured_at < f.end_time
group by f.start_time,f.end_time
order by f.start_time

分组任意秒数是相似的 – 使用date_trunc()。

更普遍的使用generate_series()可以避免猜测五分钟桶的上限。实际上,您可能会将其构建为视图或函数。您可能会从基表获得更好的性能

select 
  (select min(measured_at)::date from measurements) + ( n    || ' minutes')::interval start_time,((select max(measured_at)::date - min(measured_at)::date from measurements) + 1)*24*60,5) n;
原文链接:https://www.f2er.com/postgresql/193284.html

猜你在找的Postgre SQL相关文章