回答

收藏

每小时汇总几小时内的值

技术问答 技术问答 233 人阅读 | 0 人回复 | 2023-09-14

我有一个PostgreSQL 9.这个数据库的表包含一个 时间戳    和一个测量
5 c0 U! {; j3 c0 ]' O'2012-10-2501:00  2012-10-2502:00  5-10-25 03:00  12-10-25 04:00'   7'2012-10-25 05:00...                  ...我需要平均每小时8小时。换句话说,我需要平均1h-8h,2h-9h,3h-10h等。. W: ]. X# ]0 k$ ^- f% ^: A% K5 Y, u
我不知道如何进行这样的查询。我到处看,但我不知道该找什么功能。7 ?  R: W3 n% w; s; P$ Z
我发现的收盘价是每小时/每天的平均值或块平均值(例如1h-8h,9h-16h等等。但在这种情况下,时间戳只是使用date_trunc()函数转换(如下面的例子所示)对我来说是无用的。' ?1 X9 J7 w+ J, w- P' A
我想找的是类似的功能
% s8 L! w, h: o0 H" B1 cSELECT    date_trunc('day',timestamp),max(value) FROM      table_nameGROUP BY  date_trunc('day',timestamp);但是,在那里group-by在句子中每小时使用8小时。有可能吗?6 \/ k( q' Y' P4 e( Y9 Y1 x. R
                                                               
, m1 ]# z/ k& \    解决方案:                                                               
' I% o8 z& |8 u9 _" F                                                                一个 具有自定义框架窗口功能    使这个 非常简单    :/ U# |8 }$ R4 z( I% n8 ]
SELECT ts  avg(val) OVER (ORDER BY ts                      ROWS BETWEEN CURRENT ROW AND 7 FOLLOWING) AS avg_8hFROM tbl;sqlfiddle实时演示。
  w3 [  T- N; N2 F3 ]每个平均值的框架是当前行和后续7。假设你每小时只有一排。你的样本数据似乎暗示了这一点,但你没有指定。
0 k+ [9 R7 l& M. V- u5 k% q' T对于该集合avg_8h的最后ts7行(根据)用较少的行计算,直到最后一行的值等于其平均值。您没有指定如何处理特殊情况。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则