SQL中按ID分组后,如何判断Value列所有值是否全部相同
按分组判断所有值是否全部相同的SQL实现
咱们先来确认你的临时表结构和测试数据:
CREATE TABLE #Temp (ID int,Value char(1)) insert into #Temp (ID ,Value ) ( Select 1 ,'A' union all Select 1 ,'W' union all Select 1 ,'I' union all Select 2 ,'I' union all Select 2 ,'I' union all Select 3 ,'A' union all Select 3 ,'B' union all Select 3 ,'1' )
针对按ID分组后判断每组Value是否全部相同的需求,这里有两种简单高效的实现方式:
方法1:利用去重计数判断
通过COUNT(DISTINCT Value)统计分组内去重后的Value数量,如果结果等于1,说明所有值都相同;反之则存在不同值。
SELECT ID, CASE WHEN COUNT(DISTINCT Value) = 1 THEN '全部相同' ELSE '存在不同值' END AS ValueStatus FROM #Temp GROUP BY ID
逻辑解释
- 对于ID=1的分组,
Value有'A'、'W'、'I'三种不同值,去重计数为3,所以返回"存在不同值" - 对于ID=2的分组,
Value全是'I',去重计数为1,返回"全部相同" - 对于ID=3的分组,
Value有'A'、'B'、'1'三种不同值,返回"存在不同值"
方法2:对比分组内的最小值和最大值
如果分组内所有Value相同,那么它的最小值和最大值必然相等;反之则不等。这种方法在大数据量场景下性能可能更优,因为可以避免去重操作的开销。
SELECT ID, CASE WHEN MIN(Value) = MAX(Value) THEN '全部相同' ELSE '存在不同值' END AS ValueStatus FROM #Temp GROUP BY ID
逻辑解释
- ID=2的分组中,
MIN(Value)和MAX(Value)都是'I',二者相等,判定为全部相同 - ID=1和ID=3的分组中,最小值和最大值不相等,判定为存在不同值
两种方法都能满足需求,你可以根据实际的数据量和数据库特性选择合适的方案~
内容的提问来源于stack exchange,提问作者Dhana
相关产品推荐
相关产品推荐

