使用PostgreSQL9.2对非连续数据进行时间平均
我有多个1秒时间分辨率的实时数据集。该数据在仪器丢失数据的时间序列中,或在仪器关闭时,通常会有间隙,导致数据集不完整(尽管仍然非常有用)。结果数据可能如下所示使用PostgreSQL9.2对非连续数据进行时间平均,sql,postgresql,time-series,scientific-computing,group-by,Sql,Postgresql,Time Series,Scientific Computing,Group By,我有多个1秒时间分辨率的实时数据集。该数据在仪器丢失数据的时间序列中,或在仪器关闭时,通常会有间隙,导致数据集不完整(尽管仍然非常有用)。结果数据可能如下所示 Timestamp [timestamp] : datastream1 [double precision] : datastream2 [double precision] : etc 2011-01-01 00:00:01 153.256 1255.325 2011-01-01 00:00:02 152.95
Timestamp [timestamp] : datastream1 [double precision] : datastream2 [double precision] : etc
2011-01-01 00:00:01 153.256 1255.325
2011-01-01 00:00:02 152.954 1254.288
2011-01-01 00:00:03 151.738 1248.951
2011-01-01 00:00:04 150.015 1249.185
2011-01-01 00:10:08 179.132 1328.115
2011-01-01 00:10:09 178.051 1323.125
2011-01-01 00:10:10 180.870 1336.983
2011-01-04 09:19:02 152.198 1462.814
2011-01-04 09:19:03 158.014 1458.122
2011-01-04 09:19:04 156.070 1464.174
请注意:这些数据通常是连续的,但会有随机的间隙,必须加以处理
我需要编写代码来获取给定时间间隔“timeInt”的平均值和stdev,这能够处理这些间隙。例如,如果我想要10分钟的平均数据,我需要的输出是:
Timestamp_10min : avg_data1 : med_data1 : count_data1
其中,avg_data1是给定10分钟内所有数据点的平均值,count_data1是计算该平均值时使用的点数(即,如果没有缺失数据,则为600,如果每秒缺失一点,则为300,等等)
此代码需要使用任何所需的输入间隔(即x分钟、y天、z周、月、年等)
目前,我只能使用以下代码输出分钟平均值
CREATE OR REPLACE VIEW "DATATABLE_MIN" AS
SELECT MIN("DATATABLE"."Timestamp") AS "Timestamp_min",
avg("DATATABLE"."datastream1") AS "datastream1_avg_min",
stddev("DATATABLE"."datastream1") AS "datastream1_stdev_min",
count("DATATABLE"."datastream1") AS "datastream1_avg_min"
FROM "DATATABLE"
GROUP BY to_char("DATATABLE"."Timestamp",'YYYY-MM-DD HH24:MI'::text);
提前感谢您的帮助 要按10分钟分组,您可以使用“历元”进行分组:
这是自过去固定时间以来的秒数。如果将其除以600,则得到10分钟的间隔数,这是聚合所需的时间。因此您需要指定间隔!这意味着您想创建一个存储过程,将interval作为参数传递给它,对吗?太好了!谢谢你,戈登。有趣的是,这也使数据保持一致,并处理数据缺口。再次感谢。
SELECT MIN(dt."Timestamp") AS "Timestamp_min",
avg(dt."datastream1") AS "datastream1_avg_min",
stddev(dt."datastream1") AS "datastream1_stdev_min",
count(dt."datastream1") AS "datastream1_avg_min"
FROM "DATATABLE" dt
GROUP BY trunc(extract(epoch from dt."TimeStamp") / (60*10));