DB2 SQL:如何筛选指定列唯一且另一指定列存在重复的行?
DB2 SQL查询:找出COL1唯一且COL3重复的行
嘿,作为DB2新手,咱们一步步来搞定这个需求~ 你要找的是COL1值在整张表里唯一没重复,同时对应的COL3值存在重复的行,就像示例里的148888和155555那两行对吧?
我给你两种写法,先从最容易理解的子查询版本开始:
方法1:使用子查询筛选
SELECT t.COL1, t.COL2, t.COL3 FROM YOUR_TABLE_NAME t -- 筛选COL1只出现过一次的行 WHERE t.COL1 IN ( SELECT COL1 FROM YOUR_TABLE_NAME GROUP BY COL1 HAVING COUNT(*) = 1 ) -- 同时筛选COL3出现过多次的行 AND t.COL3 IN ( SELECT COL3 FROM YOUR_TABLE_NAME GROUP BY COL3 HAVING COUNT(*) > 1 );
拆解解释:
- 第一个子查询:把表按COL1分组,只保留那些分组后数量为1的COL1值——这些就是唯一没有重复的COL1。
- 第二个子查询:把表按COL3分组,保留分组后数量大于1的COL3值——这些就是存在重复的COL3。
- 主查询把同时满足这两个条件的行捞出来,记得把
YOUR_TABLE_NAME换成你实际的表名哦!
代入你的示例数据测试的话,第一个子查询会得到148888、147777、155555,第二个子查询得到34567、56789,两者的交集正好是你要的结果~
方法2:使用窗口函数(更高效)
如果你的表数据量比较大,窗口函数的写法会更高效,也更直观:
WITH stats AS ( SELECT COL1, COL2, COL3, -- 计算当前行的COL1在表中总共出现多少次 COUNT(*) OVER (PARTITION BY COL1) AS col1_count, -- 计算当前行的COL3在表中总共出现多少次 COUNT(*) OVER (PARTITION BY COL3) AS col3_count FROM YOUR_TABLE_NAME ) SELECT COL1, COL2, COL3 FROM stats WHERE col1_count = 1 AND col3_count > 1;
拆解解释:
- 先用
WITH创建一个临时的stats表,给每一行额外计算两个值:col1_count是当前COL1的总出现次数,col3_count是当前COL3的总出现次数。 - 然后直接从临时表里筛选出
col1_count=1(COL1唯一)且col3_count>1(COL3重复)的行就行啦!
内容的提问来源于stack exchange,提问作者DB2Jacob
相关产品推荐
相关产品推荐

