关于带DISTINCT的SQL查询中COUNT(1)=1与GROUP BY中sys的作用咨询
这段SQL语句的逻辑解析
先把你给出的SQL语句整理修正(SQL字符串常量通常用单引号):
SELECT DISTINCT col1 FROM tab1 WHERE creat_dt_tm >= sysdate - 1/24/60*30 AND condition2 = 'xyz' GROUP BY col1, sys HAVING COUNT(1) = 1
下面逐个拆解你疑问的点:
1. GROUP BY子句中的sys有什么作用?
sys是表tab1里的一个字段(大概率是系统来源、系统编码这类业务字段),GROUP BY col1,sys表示把col1值和sys值都相同的行归为同一个分组。哪怕col1值完全一样,只要对应的sys值不同,就会被拆成两个独立的分组。
2. HAVING COUNT(1)=1的作用是什么?
HAVING是对分组后的结果做筛选,COUNT(1)=1表示只保留分组内仅包含1条原始记录的分组。换而言之,在符合WHERE条件的数据集里,某个(col1,sys)的组合只出现过一次,没有重复行。
3. 已经用了DISTINCT,为什么还要这么写?
这里的DISTINCT是对GROUP BY的结果再做一次去重。因为GROUP BY是按col1+sys的组合分组,可能出现同一个col1对应不同sys的情况——比如col1='X'对应sys='SYS_A'是一个符合count=1的分组,col1='X'对应sys='SYS_B'也是一个符合count=1的分组,这时候GROUP BY后会输出两行col1='X',加上DISTINCT就能把重复的col1值合并,最终得到的是所有满足“对应每个(col1,sys)组合仅出现一次”的不重复col1值。
另外补充:其实这段SQL里的DISTINCT可以去掉,把SELECT改成SELECT col1后,再对结果做去重的逻辑和现在一致,但保留DISTINCT是更直观的写法,确保最终输出的col1没有重复值。
内容的提问来源于stack exchange,提问作者doubting
相关产品推荐
相关产品推荐

