如何将DISTINCT与CASE WHEN或类似语句结合实现特定去重结果?
解决方法
核心思路是按COL1、COL2、COL3分组,通过聚合逻辑判断每组的最终Result,而非单纯用DISTINCT去重。因为FAILURE优先级更高,只要组内存在FAILURE,最终结果就取FAILURE;只有全组都是SUCCESS时,才返回SUCCESS。
方法1:用CASE + 聚合函数判断
通过统计组内FAILURE的数量,只要数量大于0就返回FAILURE:
SELECT COL1, COL2, COL3, CASE WHEN COUNT(CASE WHEN Result = 'FAILURE' THEN 1 END) > 0 THEN 'FAILURE' ELSE 'SUCCESS' END AS FinalResult FROM ( SELECT COL1, COL2, COL3, CASE WHEN resolved THEN 'SUCCESS' ELSE 'FAILURE' END AS Result FROM table UNION ALL -- 用UNION ALL更高效,若原UNION是为了去重可保留UNION -- 其他类似结构的查询 ) AS combined_data GROUP BY COL1, COL2, COL3;
方法2:利用字符串排序特性(更简洁)
字符串排序中'FAILURE'比'SUCCESS'字母顺序更靠后,用MAX()函数直接取组内最大的Result值,就能自动优先返回FAILURE:
SELECT COL1, COL2, COL3, MAX(Result) AS FinalResult FROM ( SELECT COL1, COL2, COL3, CASE WHEN resolved THEN 'SUCCESS' ELSE 'FAILURE' END AS Result FROM table UNION ALL -- 其他类似结构的查询 ) AS combined_data GROUP BY COL1, COL2, COL3;
补充说明
- 替换原
DISTINCT为GROUP BY,因为我们需要对每组数据做逻辑判断,而非简单去重。 - 若原
UNION是为了合并结果时去重,可保留UNION;如果不需要去重,用UNION ALL性能更优。
内容的提问来源于stack exchange,提问作者Marko Taht
相关产品推荐
相关产品推荐

