基于SZERZODES_ID的记录筛选与去重需求问询
基于SZERZODES_ID的记录筛选与去重需求问询
嘿,我明白你要解决的是基于SZERZODES_ID的记录筛选问题,需求里的细节很关键,我先帮你明确规则,再结合你给的示例数据给出解决方案:
需求规则梳理
你想要的筛选逻辑可以拆解为两条核心规则:
- 对于任意
SZERZODES_ID,如果该分组下存在至少一条PARTNER_ID非空的记录,那么只保留这个分组里所有PARTNER_ID非空的记录 - 如果某个
SZERZODES_ID下所有记录的PARTNER_ID都是NULL,则保留该分组的全部记录
你的示例数据
先把你提供的原始数据整理成更清晰的表格:
| SZERZODES_ID | MUNKALAP_ID | CSAPATVEZETO_ID | PARTNER_ID |
|---|---|---|---|
| 10000000 | 10000001 | 23,323 | 682 |
| 10000000 | 10000001 | 23,323 | [NULL] |
| 10000000 | 10000002 | 23,323 | [NULL] |
| 10000000 | 10000002 | 23,323 | 682 |
| 10000000 | 10000003 | 23,323 | [NULL] |
| 10000000 | 10000004 | 23,323 | 682 |
| 10000000 | 10000005 | 23,323 | 682 |
| 10000000 | 10000005 | 23,323 | 682 |
| 10000000 | 10000006 | 23,323 | 682 |
| 10000000 | 10000006 | 23,323 | 682 |
| 20000000 | 20000001 | 4,957 | [NULL] |
| 20000000 | 20000002 | 4,957 | [NULL] |
| 20000000 | 20000003 | 4,957 | [NULL] |
| 20000000 | 20000004 | 4,957 | [NULL] |
可行的SQL解决方案
这里用窗口函数来实现你的需求,逻辑清晰且效率较高:
WITH grouped_records AS ( SELECT *, -- 统计当前SZERZODES_ID分组下,PARTNER_ID非空的记录总数 COUNT(CASE WHEN PARTNER_ID IS NOT NULL THEN 1 END) OVER (PARTITION BY SZERZODES_ID) AS non_null_partner_count FROM your_table -- 替换成你的实际表名 ) SELECT SZERZODES_ID, MUNKALAP_ID, CSAPATVEZETO_ID, PARTNER_ID FROM grouped_records WHERE -- 情况1:该分组没有非空的PARTNER_ID,全部保留 non_null_partner_count = 0 -- 情况2:该分组有非空PARTNER_ID,只保留PARTNER_ID非空的记录 OR PARTNER_ID IS NOT NULL;
逻辑说明
- 第一步通过CTE给每条记录标记所属
SZERZODES_ID分组的非空PARTNER_ID记录数 - 第二步根据标记筛选:
- 如果
non_null_partner_count = 0,说明这个分组里所有记录的PARTNER_ID都是NULL,直接全部保留 - 否则只留下PARTNER_ID非空的记录,符合你要的筛选规则
- 如果
针对你给的示例数据,执行这个SQL后:
SZERZODES_ID = 10000000会只保留所有PARTNER_ID=682的记录(共8条)SZERZODES_ID = 20000000的全部4条记录都会被保留
内容来源于stack exchange
相关产品推荐
相关产品推荐

