在滑动窗口框架中查找最大和最小列值

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

来自过程编程,我正在考虑一个循环来解决这个问题。逻辑示例:

  • column1
    值和日期列降序排序。查询类似于:
select * 
from table1 
where column1 in ('cpu1') 
order by date_time desc;
  • 找到选择查询的最后一行及其上方的第 22 行,以定义要查看的第一组数据的循环起点。我当前没有序列化行,但知道每个行条目之间的时间为 5 分钟,因此我可以使用时间戳来确定 22 行。我认为查询看起来像这样:
select * 
from table1 
where date_time between x and y;
  • 找到在 Between 语句中选择的数据中的第 10 行,并确定第 10 行中的第 2 列是否大于上面所有 12 行和下面所有 9 行基于或第 3 列第 10 行小于上面 12 行和下面 9 行。如果大于或小于,则将第 10 行打印到新表中。

我还没有任何用于此查询的信息,因为我不明白如何以 Javascript 数组或 Python 字典的方式导航表索引。

  • 将 x、y 和第 10 行值递增 -1 并再次运行循环。

问题

我正在努力理解如何将 PostgreSQL 脚本组合在一起。我已经使用 Python 或 Javascript 设计了类似的样式循环,但是我对 SQL 中可能的方法了解得越多,我就越感到困惑。执行此 CTE 的最佳方法是 for、while 还是游标?

表格数据示例:

第1栏 第2栏 第3栏 日期
CPU1 3.2 1.1 01:45:00
CPU1 3.5 1.3 01:40:00
CPU1 5.9 0.1 01:35:00
CPU1 1.7 1.2 01:30:00
CPU1 2.5 2.3 01:25:00
CPU1 5.2 4.1 01:20:00
CPU3 4.2 1.1 01:45:00
CPU3 3.1 1.0 01:40:00
CPU3 5.0 3.3 01:35:00
CPU3 4.7 3.2 01:30:00
CPU3 2.7 2.1 01:25:00
CPU3 6.2 4.8 01:20:00
  • column1
    将是将时间序列写入数据库的设备名称
  • column2
    column3
    将记录来自设备的值
  • 日期始终以 5 分钟为增量
  • table1 有数百万行
sql postgresql greatest-n-per-group window-functions
1个回答
0
投票

这可以通过窗口函数优雅而高效地实现:

对于所有设备:

SELECT *
FROM  (
   SELECT *, col2 > max(col2) OVER (PARTITION BY device ORDER BY ts ROWS BETWEEN 12 PRECEDING AND 9 FOLLOWING EXCLUDE CURRENT ROW)
          OR col3 < min(col3) OVER (PARTITION BY device ORDER BY ts ROWS BETWEEN 12 PRECEDING AND 9 FOLLOWING EXCLUDE CURRENT ROW) AS bingo
   FROM   tbl
   ) sub
WHERE  bingo;

对于单个给定设备:

SELECT *
FROM  (
   SELECT *
        , col2 > max(col2) OVER (ORDER BY ts ROWS BETWEEN 12 PRECEDING AND 9 FOLLOWING EXCLUDE CURRENT ROW) OR
          col3 < min(col3) OVER (ORDER BY ts ROWS BETWEEN 12 PRECEDING AND 9 FOLLOWING EXCLUDE CURRENT ROW) AS bingo
   FROM   tbl
   WHERE  device = 'cpu3'
   ) sub
WHERE  bingo;

小提琴

假设所有列都已定义

NOT NULL
,并且每个设备的时间戳(我的查询中的
ts
)也是
UNIQUE
。或者您必须定义如何处理排序顺序中的空值和重复项。

这使用了一整套高级窗口函数功能。 “帧排除”选项

EXCLUDE CURRENT ROW
需要 Postgres 11 或更高版本。 请阅读此处的手册。相关:

如果您习惯了过程语言,这不是一件容易的事。

© www.soinside.com 2019 - 2024. All rights reserved.