0

我有一个表 CPU,其中包含一些通过 Influx 线路协议传入的指标,我如何运行一个查询来告诉我数据是否在过去 x 分钟内超过了某个阈值,

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

select usage_system, timestamp
from cpu
Where usage_system > 20

但我已退回所有记录。对于时间范围,我不想硬编码时间戳或必须将其替换为当前时间以获得相对查询

用法 时间戳
27.399999999906 2021-04-14T12:02:30.000000Z
26.400000000139 2021-04-14T12:02:30.000000Z
25.666666666899 2021-04-14T12:02:30.000000Z
... ...

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

4

1 回答 1

1

以下查询将动态过滤时间戳字段的最后 5 分钟,并将根据硬编码值返回行(when usage_systemis above 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在聚合之上:

时间戳 用法 平均的 高于平均水平
2021-04-14T13:30:00.000000Z 20 10 真的
2021-04-14T13:30:00.000000Z 5 10 错误的

如果您想要所有列,则将此过滤器向下移动到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;

然后,这将允许进行更复杂的过滤,例如返回某个百分位数的所有行,如下所示,它将返回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 关键字文档中的示例

于 2021-04-14T14:04:39.210 回答