所以我有一个错误日志需要分析。
在那个错误日志中有一些字段叫做
- EVENT_ATTRIBUTE,显示收集该信息的设备的名称。
- EVENT_SEVERITY,显示从 1 到 5 的数字。在此列中,我需要找到 4 和 5 的数量。
问题是我需要获得不同的 EVENT_ATTRIBUTES,然后计算与该特定 EVENT_ATTRIBUTE 相关的所有 4 和 5,并输出计数。
基本上传感器(event_attribute)检测不同的错误。我需要分析每个传感器接收到多少个 4 和 5,以便我可以分析它们。
我在使用不同的传感器并将它们链接到特定传感器时遇到问题。到目前为止我已经尝试过了,但它只返回相同的数字 4 和 5,所以我认为我做的不正确。
SELECT DISTINCT LEFT(EVENT_ATTRIBUTE, locate('(', EVENT_ATTRIBUTE, 1)-1) AS
SensorName,
COUNT(CASE WHEN 'EVENT_SEVERITY' <>5 THEN 1 END) AS ERROR5,
COUNT(CASE WHEN 'EVENT_SEVERITY' <>4 THEN 1 END) AS ERROR4
FROM nodeapp.disc_event
WHERE EVENT_SEVERITY IN (5,4)
Group BY SensorName;
这是我正在查看的表格。 Event Error Table
我正在截断事件属性,因为 IP 地址无关紧要。基本上我想让唯一的 event_attribute 充当主键并计算连接到该主键的 4 和 5 的数量。
使用上面的代码我得到了这个输出:Event Result Table
谢谢大家的帮助!
最佳答案
你非常接近。
DISTINCT
在分组时是不必要的。
您需要 SUM()
。 COUNT()
只计算非空的所有内容。您可以利用 bool 表达式计算结果为 1 或 0 的技巧。
SELECT LEFT(EVENT_ATTRIBUTE, LOCATE('(', EVENT_ATTRIBUTE, 1)-1) AS SensorName,
SUM(EVENT_SEVERITY = 5) ERROR_5,
SUM(EVENT_SEVERITY = 4) ERROR_4,
COUNT(*) ALL_ERRORS
FROM nodeapp.disc_event
GROUP BY LEFT(EVENT_ATTRIBUTE, LOCATE('(', EVENT_ATTRIBUTE, 1)-1);
即使 EVENT_SEVERITY
值在您的 DBMS 中存储为字符串,EVENT_SEVERITY = 4
等表达式也会隐式地将它们强制转换为整数。
包含批处理总计(如 COUNT(*)
)通常是一种很好的做法,尤其是在调试时;它们可以很好地检查您是否正确处理数据。
关于mysql - 选择不同的列,然后计算与 MySQL 中该列相关的 2 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44597446/