You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:25:22