如何查询 Postgresql 数据库以获取滑动时间窗口中满足条件的一小部分行?

问题描述 投票:0回答:1

这是我上一篇文章的后续内容 如何计算满足条件的行的分数

我有一个带时间戳的表:

timestamp: timestamp
field1: double
...
more fields

我想要实现的是在特定时间窗口内满足标准的带时间戳的滚动行分数。例如,最后一分钟/5 小时/天满足“field1 > Crit”的行的分数。

我已经找到了一种方法来计算行滑动窗口上 field1 的平均值:

SELECT timestamp, avg(a.field1)
   OVER(ORDER BY a.timestamp ROWS BETWEEN 29 PRECEDING AND CURRENT ROW)
   AS output_name
   FROM schema."table" a;

但我无法将其扩展到我所需要的。

sql postgresql aggregate-functions
1个回答
2
投票

您正在寻找

range
窗框条款演示

SELECT timestamp, 
       a.field1,
       count(*)filter(where a.field1>5)over w1
        / (count(*)over w1)::float AS "fraction of field1 > crit",
       avg(a.field1)over w1,
       min(a.field1)over w1,
       max(a.field1)over w1
FROM schema1."table1" AS a
WINDOW w1 AS (ORDER BY a.timestamp 
              RANGE BETWEEN '1 hour' PRECEDING 
                        AND CURRENT ROW)
LIMIT 10;
时间戳 字段1 field1 的分数 > 暴击 平均 分钟 最大
2024-02-29 02:52:29.352841 6 1 6 6 6
2024-02-29 03:06:52.759728 2 0.5 4 2 6
2024-02-29 03:10:21.047632 9 0.6666666666666666 5.666666666666667 2 9
2024-02-29 03:37:06.321381 0 0.5 4.25 0 9
2024-02-29 03:45:06.147972 10 0.6 5.4 0 10
2024-02-29 03:48:36.642597 3 0.5 5 0 10
2024-02-29 04:17:40.280552 8 0.5 5.25 0 10
2024-02-29 04:19:19.055374 10 0.6 6.2 0 10
2024-02-29 04:27:43.887064 1 0.5 5.333333333333333 0 10
2024-02-29 04:54:47.489977 9 0.75 7 1 10
© www.soinside.com 2019 - 2024. All rights reserved.