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

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

我已经知道使用了

(a)date_trunc(‘hour’,measured_at)

(b)generate_series

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

  1. microseconds,milliseconds
  2. .
  3. .
  4. .

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

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

您可以通过添加generate_series()创建的间隔来生成“buckets”表。此sql语句将在数据中生成第一天五分钟存储桶(min(measured_at)的值)表。
  1. select
  2. (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
  3. from generate_series(0,(24*60),5) n

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

  1. with five_min_intervals as (
  2. select
  3. (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
  4. from generate_series(0,5) n
  5. )
  6. select f.start_time,f.end_time,avg(m.val) avg_val
  7. from measurements m
  8. right join five_min_intervals f
  9. on m.measured_at >= f.start_time and m.measured_at < f.end_time
  10. group by f.start_time,f.end_time
  11. order by f.start_time

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

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

  1. select
  2. (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;

猜你在找的Postgre SQL相关文章