如何计算 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
我有一个 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