基于规则标记t1表重复数据的SQL实现问题求助
解决方案
规则优先级梳理
先明确规则的执行逻辑顺序:
- 所有
idcommande唯一的行,直接标记为keep - 同一
idcommande分组内,满足statut='in progress' AND typecom='canceled'的行标记为keep - 剩余分组内的行,仅保留
idref IS NOT NULL的,标记为keep;其余标记为discard
实现SQL代码
使用窗口函数COUNT()判断分组行数,结合CASE语句完成标记:
SELECT t1.*, CASE -- 规则1:idcommande唯一的行 WHEN COUNT(*) OVER (PARTITION BY idcommande) = 1 THEN 'keep' -- 规则2:满足statut和typecom条件的行 WHEN statut = 'in progress' AND typecom = 'canceled' THEN 'keep' -- 规则3:idref不为空的行 WHEN idref IS NOT NULL THEN 'keep' -- 其余行标记为丢弃 ELSE 'discard' END AS keep_flag FROM t1;
如果需要布尔类型标记(True/False),只需替换对应值:
SELECT t1.*, CASE WHEN COUNT(*) OVER (PARTITION BY idcommande) = 1 THEN TRUE WHEN statut = 'in progress' AND typecom = 'canceled' THEN TRUE WHEN idref IS NOT NULL THEN TRUE ELSE FALSE END AS keep_flag FROM t1;
逻辑验证示例
假设测试数据:
| idcommande | statut | typecom | idref |
|---|---|---|---|
| 1001 | completed | normal | REF01 |
| 1002 | in progress | canceled | NULL |
| 1002 | pending | normal | NULL |
| 1003 | in progress | normal | NULL |
| 1003 | completed | canceled | REF02 |
执行后结果:
| idcommande | statut | typecom | idref | keep_flag |
|---|---|---|---|---|
| 1001 | completed | normal | REF01 | keep |
| 1002 | in progress | canceled | NULL | keep |
| 1002 | pending | normal | NULL | discard |
| 1003 | in progress | normal | NULL | discard |
| 1003 | completed | canceled | REF02 | keep |
该结果完全符合所有规则要求。
内容的提问来源于stack exchange,提问作者dia05
相关产品推荐
相关产品推荐

