我有一个具有以下结构的表:
ID | FK_1 | FK_2 | MONTH | STATE
12 171 26 4 APPROVED
13 171 26 4 SUPER_APPROVED
14 56 32 4 APPROVED
15 45 34 4 SUPER_APPROVED
16 45 34 4 APPROVED
17 22 65 4 REJECTED
我需要删除重复的行,以便只有一行包含FOREIGN_KEY_1,FOREIGN_KEY_2和MONTH的每种可能组合。
如果该组合有两行(例如上面的行ID 12& 13或15& 16),我想只保留具有SUPER_APPROVED状态的行。
运行脚本后,我希望表格中包含以下数据(基于上面的示例数据):
ID | FK_1 | FK_2 | MONTH | STATE
13 171 26 4 SUPER_APPROVED
14 56 32 4 APPROVED
15 45 34 4 SUPER_APPROVED
17 22 65 4 REJECTED
非常感谢任何帮助
答案 0 :(得分:3)
我们的想法是生成您要保留的行列表。这是一个查询:
select FK_1, FK_2, MONTH,
coalesce(min(case when state = 'SUPER_APPROVED' then id end),
min(id)
) as id
from table t
group by FK_1, FK_2, MONTH;
请注意,当组合有1行时,该行的ID位于id
。否则,它遵循您更喜欢SUPER_APPROVED
行的规则。
您可以使用delete
:
left outer join
delete t
from table t left outer join
(select FK_1, FK_2, MONTH,
coalesce(min(case when state = 'SUPER_APPROVED' then id end),
min(id)
) as id
from table t
group by FK_1, FK_2, MONTH
) as tokeep
on t.id = tokeep.id
where tokeep.id is null;