来自过程编程,我正在考虑一个循环来解决这个问题。逻辑示例:
column1
值和日期列降序排序。查询类似于:select *
from table1
where column1 in ('cpu1')
order by date_time desc;
select *
from table1
where date_time between x and y;
我还没有任何用于此查询的信息,因为我不明白如何以 Javascript 数组或 Python 字典的方式导航表索引。
问题
我正在努力理解如何将 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
将记录来自设备的值这可以通过窗口函数优雅而高效地实现:
对于所有设备:
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 或更高版本。 请阅读此处的手册。相关:
如果您习惯了过程语言,这不是一件容易的事。