如何计算 QuestDB 中过去 x 分钟内的数据峰值

How do I calculate spikes in data over the last x amount of minutes in QuestDB

我有一个 table CPU 有一些指标通过 Influx 线路协议传入,我如何 运行 一个查询来告诉我数据是否超过了某个阈值最后 x 分钟,

我正在尝试做类似的事情:

select usage_system, timestamp
from cpu
Where usage_system > 20

但是我已经返回了所有记录。对于时间范围,我不想硬编码时间戳或者必须用当前时间替换它才能获得相对查询

usage timestamp
27.399999999906 2021-04-14T12:02:30.000000Z
26.400000000139 2021-04-14T12:02:30.000000Z
25.666666666899 2021-04-14T12:02:30.000000Z
... ...

理想情况下,我希望能够检查使用情况是否高于平均水平,但目前高于硬编码值就可以了。

以下查询将动态过滤时间戳字段的最后 5 分钟,并根据硬编码值 return 行(当 usage_system 高于 20 时):

SELECT *
FROM cpu
WHERE usage_system > 20
AND timestamp > dateadd('m', -5, now());

如果要向查询添加更多详细信息,可以交叉连接聚合值:

WITH avg_usage AS (select avg(usage_system) average FROM cpu)
SELECT timestamp, cpu.usage_system usage, average, cpu.usage_system > avg_usage.average above_average
FROM cpu CROSS JOIN avg_usage
Where timestamp > dateadd('m', -5, now());

这将添加一个布尔值列 above_average 并且是真还是假取决于行的 usage_system 是否高于聚合:

timestamp usage average above_average
2021-04-14T13:30:00.000000Z 20 10 true
2021-04-14T13:30:00.000000Z 5 10 false

如果您想要所有列,将此筛选器向下移动到 WHERE 子句中可能会有用:

WITH avg_usage AS (select avg(usage_system) average FROM cpu)
SELECT *
FROM cpu CROSS JOIN avg_usage
WHERE timestamp > dateadd('m', -5, now())
AND cpu.usage_system > avg_usage.average;

这将允许进行更复杂的过滤,例如 return 过滤某个百分位的所有行,如下所示将 return 行 usage_system在过去 5 分钟内超过记录最大值的 80%(即最高 CPU 使用率):

WITH max_usage AS (select max(usage_system) maximum FROM cpu)
SELECT *
FROM cpu CROSS JOIN max_usage
WHERE timestamp > dateadd('m', -5, now())
AND cpu.usage_system > (max_usage.maximum / 100 * 80);

编辑: 最后一个查询是基于 QuestDB 中的示例 WITH keyword documentation