如何编写SQL查询找出主从节点计数不匹配的时间戳
问题描述
现有数据表mytable,数据如下:
Timestamp Image Count t1 Master 10 t1 Slave1 4 t1 Slave2 6 t2 Master 9 t2 Slave1 5 t2 Slave2 4 t3 Master 13 t3 Master 8 t3 Master 6
规则要求:同一时间戳下,Master的计数总和需等于所有Slave的计数总和。需要先得到每个时间戳的主从计数对比结果,再筛选出主从计数不匹配的记录。
期望的中间结果:
t1 10 10 t2 10 10 t3 13 14
期望的最终结果:
t3 13 14
以下是实现需求的正确SQL写法:
第一步:计算每个时间戳的主从计数总和
通过条件聚合分别统计同一时间戳下Master和所有Slave的总计数:
SELECT Timestamp AS T, SUM(CASE WHEN Image = 'Master' THEN Count ELSE 0 END) AS Master_Total, SUM(CASE WHEN Image LIKE 'Slave%' THEN Count ELSE 0 END) AS Slave_Total FROM mytable GROUP BY Timestamp;
这条语句按时间戳分组,利用CASE语句分别累加Master和Slave的计数,直接得到你需要的中间对比结果。
第二步:筛选主从计数不匹配的记录
在第一步的基础上,添加HAVING子句过滤计数不相等的记录:
SELECT Timestamp AS T, SUM(CASE WHEN Image = 'Master' THEN Count ELSE 0 END) AS Master_Total, SUM(CASE WHEN Image LIKE 'Slave%' THEN Count ELSE 0 END) AS Slave_Total FROM mytable GROUP BY Timestamp HAVING SUM(CASE WHEN Image = 'Master' THEN Count ELSE 0 END) <> SUM(CASE WHEN Image LIKE 'Slave%' THEN Count ELSE 0 END);
也可以用子查询的方式,先生成中间结果再筛选:
SELECT T, Master_Total, Slave_Total FROM ( SELECT Timestamp AS T, SUM(CASE WHEN Image = 'Master' THEN Count ELSE 0 END) AS Master_Total, SUM(CASE WHEN Image LIKE 'Slave%' THEN Count ELSE 0 END) AS Slave_Total FROM mytable GROUP BY Timestamp ) AS totals WHERE Master_Total <> Slave_Total;
两种写法都能得到最终的不匹配记录。
内容的提问来源于stack exchange,提问作者vol
相关产品推荐
相关产品推荐

