如何筛选Col1与Col2中所有Col3值符合LIKE %ABGS%的记录
筛选满足全部分组条件的Col1和Col2记录
需求说明
需要从数据表中提取Col1和Col2的记录,但仅保留**Col1+Col2分组下所有Col3值均包含"ABGS"**的条目。若某个Col1+Col2分组中存在任意一条Col3值不满足LIKE '%ABGS%',则该分组的所有记录都需排除。
示例数据
原表格
| Col1 | Col2 | Col3 |
|---|---|---|
| PSPID_1 | POSID_10 | FREI ABGS EROF |
| PSPID_1 | POSID_11 | ABGS EROF |
| PSPID_1 | POSID_12 | FREI ABGS |
| PSPID_2 | POSID_20 | FREI ABGS |
| PSPID_2 | POSID_21 | EROF |
| PSPID_3 | POSID_30 | ABGS EROF |
| PSPID_3 | POSID_31 | ABGS EROF |
| PSPID_3 | POSID_32 | FREI ABGS EROF |
| PSPID_3 | POSID_33 | FREI ABGS |
期望结果
| Col1 | Col2 |
|---|---|
| PSPID_1 | POSID_10 |
| PSPID_1 | POSID_11 |
| PSPID_1 | POSID_12 |
| PSPID_3 | POSID_30 |
| PSPID_3 | POSID_31 |
| PSPID_3 | POSID_32 |
| PSPID_3 | POSID_33 |
规则说明
- PSPID_1的所有Col2分组(POSID_10/11/12)对应的Col3都包含"ABGS",全部保留
- PSPID_2的分组中,POSID_21的Col3不含"ABGS",因此该PSPID_2下的所有记录都排除
- PSPID_3的所有Col2分组对应的Col3都包含"ABGS",全部保留
数据聚类结构
- PSPID_1
- POSID_10
- POSID_11
- POSID_12
- PSPID_2
- POSID_20
- POSID_21
- PSPID_3
- POSID_30
- POSID_31
- POSID_32
- POSID_33
- PSPID_4
- POSID_40
- POSID_41
……
实现方案
方法1:使用NOT EXISTS子查询
通过子查询找出所有存在不满足条件的Col1+Col2分组,再排除这些分组的记录:
SELECT DISTINCT Col1, Col2 FROM your_table t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table t2 WHERE t1.Col1 = t2.Col1 AND t1.Col2 = t2.Col2 AND t2.Col3 NOT LIKE '%ABGS%' );
方法2:使用GROUP BY和HAVING
先按Col1+Col2分组,筛选出所有分组内的Col3都满足条件的分组,再关联原表获取记录:
SELECT t1.Col1, t1.Col2 FROM your_table t1 JOIN ( SELECT Col1, Col2 FROM your_table GROUP BY Col1, Col2 HAVING COUNT(CASE WHEN Col3 NOT LIKE '%ABGS%' THEN 1 END) = 0 ) t2 ON t1.Col1 = t2.Col1 AND t1.Col2 = t2.Col2;
或者更简洁的HAVING写法(适配多数主流数据库):
SELECT Col1, Col2 FROM your_table GROUP BY Col1, Col2 HAVING SUM(CASE WHEN Col3 NOT LIKE '%ABGS%' THEN 1 ELSE 0 END) = 0;
(注:若需保留重复的Col1+Col2记录,去掉GROUP BY,改用关联子查询的方式即可)
内容的提问来源于stack exchange,提问作者GillesP
相关产品推荐
相关产品推荐

