SQL特殊条件分组过滤:按指定规则筛选目标数据
需求与解决方案
原始数据
Blockquote
| id_doc | id_exp | id_act | fecha |
|---|---|---|---|
| 500 | 2000 | 3 | 2021-10-23 |
| 501 | 2000 | 4 | NULL |
| 502 | 2000 | 6 | 2021-10-23 |
| 503 | 2000 | 2 | 2021-10-23 |
| 504 | 3000 | 4 | NULL |
| 505 | 3000 | 6 | 2021-10-23 |
| 506 | 4000 | 3 | 2021-10-23 |
| 507 | 4000 | 4 | NULL |
Blockquote
筛选规则
需筛选出满足以下条件的id_exp对应的所有记录:
- 该
id_exp下存在id_act=4且fecha为NULL的记录 - 该
id_exp下不存在id_act为2或6的记录
预期结果
Blockquote
| id_doc | id_exp | id_act | fecha |
|---|---|---|---|
| 506 | 4000 | 3 | 2021-10-23 |
| 507 | 4000 | 4 | NULL |
实现方案
以下提供两种常用的SQL实现方式:
方案1:子查询筛选目标id_exp
SELECT * FROM your_table WHERE id_exp IN ( -- 筛选存在id_act=4且fecha为NULL的id_exp SELECT id_exp FROM your_table WHERE id_act = 4 AND fecha IS NULL EXCEPT -- 排除存在id_act为2或6的id_exp SELECT id_exp FROM your_table WHERE id_act IN (2, 6) );
方案2:窗口函数统计条件
WITH exp_stats AS ( SELECT id_exp, MAX(CASE WHEN id_act=4 AND fecha IS NULL THEN 1 ELSE 0 END) AS has_valid_act4, MAX(CASE WHEN id_act IN (2,6) THEN 1 ELSE 0 END) AS has_invalid_act FROM your_table GROUP BY id_exp ) SELECT t.* FROM your_table t JOIN exp_stats s ON t.id_exp = s.id_exp WHERE s.has_valid_act4 = 1 AND s.has_invalid_act = 0;
内容的提问来源于stack exchange,提问作者TonySw
相关产品推荐
相关产品推荐

