按Candidate_Key分区处理NULL值筛选Job_Key的SQL实现问题
SQL实现方案
以下是兼容多数主流数据库(MySQL8.0+、PostgreSQL、Oracle、SQL Server等)的实现代码:
窗口函数实现(推荐,性能最优)
WITH ranked_data AS ( SELECT Candidate_Key, Job_Key, -- 统计当前Candidate分组下非NULL的Job_Key总数,COUNT会自动忽略NULL值 COUNT(Job_Key) OVER (PARTITION BY Candidate_Key) AS non_null_job_cnt, -- 给同分组内的行排序,方便全NULL分组取第一条记录 ROW_NUMBER() OVER (PARTITION BY Candidate_Key ORDER BY CASE WHEN Job_Key IS NULL THEN 1 ELSE 2 END DESC) AS rn FROM 你的原表名 ) SELECT DISTINCT Candidate_Key, Job_Key FROM ranked_data WHERE -- 规则1:分组存在非空Job_Key时,仅保留非空的唯一记录 (non_null_job_cnt > 0 AND Job_Key IS NOT NULL) -- 规则2:分组全为NULL时,仅保留第一条NULL记录 OR (non_null_job_cnt = 0 AND rn = 1) ORDER BY Candidate_Key;
兼容低版本数据库的UNION ALL实现
如果数据库不支持窗口函数,可以用拆分逻辑的写法:
-- 取存在非空Job的分组的所有非空唯一记录 SELECT DISTINCT Candidate_Key, Job_Key FROM 你的原表名 t1 WHERE Job_Key IS NOT NULL AND EXISTS ( SELECT 1 FROM 你的原表名 t2 WHERE t2.Candidate_Key = t1.Candidate_Key AND t2.Job_Key IS NOT NULL ) UNION ALL -- 取全为NULL的分组的第一条NULL记录 SELECT Candidate_Key, MAX(Job_Key) AS Job_Key FROM 你的原表名 t1 WHERE NOT EXISTS ( SELECT 1 FROM 你的原表名 t2 WHERE t2.Candidate_Key = t1.Candidate_Key AND t2.Job_Key IS NOT NULL ) GROUP BY Candidate_Key ORDER BY Candidate_Key;
内容的提问来源于stack exchange,提问作者venugopal
相关产品推荐
相关产品推荐

