以下查询将动态过滤时间戳字段的最后 5 分钟,并将根据硬编码值返回行(when usage_system
is 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 关键字文档中的示例