SQL查询需求:筛选仅单个检查类型为incomplete的应用
解决方案
核心思路
要筛选出仅1种检查类型状态为incomplete,其余所有检查均为complete的application,关键是统计每个application下:
- incomplete状态的检查数量恰好为1
- 所有非incomplete的检查状态都是complete(若业务存在其他状态,需额外排除)
方法一:分组聚合(GROUP BY + HAVING)
假设你的表名为inspections,包含字段application_id(对应application标识,如2024-1)、inspection_type、status,可以用以下SQL:
SELECT application_id FROM inspections GROUP BY application_id HAVING -- 统计incomplete的检查数恰好为1 SUM(CASE WHEN status = 'incomplete' THEN 1 ELSE 0 END) = 1 -- 确保没有除complete/incomplete外的其他异常状态(业务仅存两种状态时可省略) AND SUM(CASE WHEN status NOT IN ('complete', 'incomplete') THEN 1 ELSE 0 END) = 0 -- 验证总检查数 = complete数量 + 1(即仅1条incomplete记录) AND COUNT(*) = SUM(CASE WHEN status = 'complete' THEN 1 ELSE 0 END) + 1;
方法二:窗口函数(WITH子句)
如果需要同时查看对应incomplete的检查类型,或更灵活扩展逻辑,可用窗口函数实现:
WITH app_inspection_stats AS ( SELECT application_id, inspection_type, status, -- 统计当前application下的incomplete总数 COUNT(CASE WHEN status = 'incomplete' THEN 1 END) OVER (PARTITION BY application_id) AS incomplete_count, -- 统计当前application下非complete的总数 COUNT(CASE WHEN status != 'complete' THEN 1 END) OVER (PARTITION BY application_id) AS non_complete_count FROM inspections ) -- 去重得到符合条件的application SELECT DISTINCT application_id FROM app_inspection_stats -- 仅当incomplete数为1,且所有非complete记录都是这1条incomplete时符合条件 WHERE incomplete_count = 1 AND non_complete_count = 1;
示例验证
针对你提到的场景:
- 2024-1:仅Final检查为incomplete,其余均为complete → 两种方法都会选中它
- 2024-2:Final和Plumbing均为incomplete →
incomplete_count=2,不符合条件,会被排除
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

