如何用SQL Server统计EventLog各deviceId的Type3/Type4并筛选差异项
正确的SQL Server实现方案
针对你的需求,最直接高效的实现方式是使用条件聚合分别统计两类事件的次数,再通过HAVING子句筛选计数不等的记录:
SELECT deviceId, SUM(CASE WHEN eventType = 'eventType3' THEN 1 ELSE 0 END) AS Type3, SUM(CASE WHEN eventType = 'eventType4' THEN 1 ELSE 0 END) AS Type4 FROM EventLog GROUP BY deviceId HAVING SUM(CASE WHEN eventType = 'eventType3' THEN 1 ELSE 0 END) != SUM(CASE WHEN eventType = 'eventType4' THEN 1 ELSE 0 END);
代码说明:
SUM(CASE...):通过条件判断,仅当匹配目标事件类型时计1,否则计0,求和后得到对应事件的总次数。GROUP BY deviceId:按设备ID分组,确保每个deviceId只返回一条统计记录。HAVING子句:在分组统计完成后筛选出Type3和Type4计数不相等的记录(注意不能用WHERE,因为WHERE是分组前过滤行,无法引用聚合后的列)。
如果你的eventType是数值类型(比如直接用3、4标识),只需把语句里的字符串常量改成对应数值即可:
SELECT deviceId, SUM(CASE WHEN eventType = 3 THEN 1 ELSE 0 END) AS Type3, SUM(CASE WHEN eventType = 4 THEN 1 ELSE 0 END) AS Type4 FROM EventLog GROUP BY deviceId HAVING SUM(CASE WHEN eventType = 3 THEN 1 ELSE 0 END) != SUM(CASE WHEN eventType = 4 THEN 1 ELSE 0 END);
内容的提问来源于stack exchange,提问作者nettwerker1
相关产品推荐
相关产品推荐

