繁体   English   中英

选择distinct列,然后计算与MySQL中该列相关的2列

[英]Select distinct column and then count 2 columns that relate to that column in MySQL

所以我有一个我需要分析的错误日志。

在该错误日志中,有一些字段被调用

  • 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;

这是我正在看的表。 事件错误表

我截断了事件属性,因为IP地址无关紧要。 基本上我想让唯一的event_attribute充当主键,并计算连接到该主键的4和5的数量。

使用上面的代码,我得到了这个输出: 事件结果表

谢谢你的帮助!

查询将'EVENT_SEVERITY'解释为字符串,尝试使用`或双引号来分隔字段。 ...虽然它是“标准的”,但我倾向于回避双引号,因为它们看起来应该是字符串(在MySQL的某些配置中)。

编辑(为清晰起见):我的意思是它将'EVENT_SEVERITY'字面解释为字符串“EVENT_SEVERITY”,而不是字段作为字符串的基础值。

你很近。

当您进行分组时, DISTINCT是不必要的。

你想要SUM() COUNT()只计算非空的所有内容。 您可以利用布尔表达式求值为1或0的hack。

 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等表达式EVENT_SEVERITY = 4它们强制转换为整数。

通常很好的做法是包括COUNT(*)等批处理总计,尤其是在调试时; 它们形成了良好的健全性检查,您正确处理数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM