SQL查询平均内存使用率时HAVING与WHERE混用报错如何解决?
SQL查询内存使用率平均值的正确写法
核心规则说明
WHERE和HAVING的执行顺序和适用场景有明确区别:
- WHERE 执行于聚合计算之前,用于过滤原始数据行,仅支持对表中原生字段设置筛选条件,不支持聚合函数结果、SELECT语句中定义的别名作为筛选条件
- HAVING 执行于聚合计算之后,用于过滤聚合后的结果集,仅支持对聚合计算结果、分组字段设置筛选条件
报错原因说明
- 第一次报错:将
@timestamp这类原生字段的过滤条件放到了HAVING中,不符合HAVING的使用规则 - 第二次报错:将
AVG(system.memory.actual.used.pct)这类聚合函数结果的过滤条件放到了WHERE中,不符合WHERE的使用规则
正确查询语句
将原生字段过滤条件放在WHERE中,聚合结果过滤条件放在HAVING中即可:
SELECT AVG(system.memory.actual.used.pct) AS averageMemory FROM "metricbeat*" WHERE host.name.keyword='data.storage' AND "@timestamp" BETWEEN '2021-10-01T00:00:00.000Z' AND '2021-10-15T00:00:00.000Z' HAVING AVG(system.memory.actual.used.pct) > 0.3
如果你的SQL查询引擎支持HAVING子句引用SELECT中定义的别名,也可以将HAVING条件简化为HAVING averageMemory > 0.3。
内容的提问来源于stack exchange,提问作者Marcos Vasquez
相关产品推荐
相关产品推荐

