SQL查询:找出同一ID和Version下Type A与B的Value不同的行
解决SQL筛选ID-Version分组下A/B Value不同的行的问题
没问题,我来帮你搞定这个查询需求。根据你的描述,我们需要找出所有同一ID和Version组合中,Type为A和B对应的Value不相等的行,也就是只保留那些分组里A、B值不一样的组的全部记录。
方法一:使用窗口函数(推荐,简洁高效)
这种方法利用窗口函数计算每个ID-Version分组的最大和最小Value,只要最大和最小值不相等,就说明该分组里存在不同的Value(也就是A和B值不一样),随后筛选出这些行即可:
SELECT ID, Version, Type, Value FROM ( SELECT ID, Version, Type, Value, -- 计算当前ID-Version分组的最大Value MAX(Value) OVER (PARTITION BY ID, Version) AS max_val, -- 计算当前ID-Version分组的最小Value MIN(Value) OVER (PARTITION BY ID, Version) AS min_val FROM your_table_name -- 替换成你的实际表名 ) AS subquery -- 筛选出分组内最大最小Value不等的行 WHERE max_val != min_val;
方法二:使用分组筛选+自连接
先通过分组找出所有Value存在差异的ID-Version组合,再关联原表取出这些组合的所有行:
SELECT t.* FROM your_table_name t -- 替换成你的实际表名 INNER JOIN ( -- 找出所有ID-Version分组中,Value的不同值数量大于1的组 SELECT ID, Version FROM your_table_name GROUP BY ID, Version HAVING COUNT(DISTINCT Value) > 1 ) AS diff_groups ON t.ID = diff_groups.ID AND t.Version = diff_groups.Version;
验证结果
用你提供的测试数据运行上述任意一种查询,都会返回唯一符合条件的ID-Version组合(121-1)的两行数据:
| ID | Version | Type | Value |
|---|---|---|---|
| 121 | 1 | A | 100 |
| 121 | 1 | B | 200 |
记得把代码里的your_table_name替换成你实际使用的表名哦。
内容的提问来源于stack exchange,提问作者Siddhant Aggarwal
相关产品推荐
相关产品推荐

