Oracle中基于列值为同一键对提取单行数据的实现
Oracle 数据筛选:按优先级提取地址
原始数据
| Account. | Client. | Address |
|---|---|---|
| Abc. | Aaa. | Mailing |
| Abc | Aaa. | Domicile |
| Ccc. | Aaa. | Mailing |
| Ccc. | Aaa. | Domicile |
| Ccc. | Aaa. | Office |
| Ddd. | Bbb. | Domicile |
| Ddd. | Bbb. | Office |
需求说明
针对同一 Client. + Account. 组合:
- 若存在
Mailing地址,仅保留该类型地址的记录 - 若无
Mailing地址,仅保留Domicile地址记录
预期结果
| Account. | Client. | Address |
|---|---|---|
| Abc. | Aaa. | Mailing |
| Ccc. | Aaa. | Mailing |
| Ddd. | Bbb. | Domicile |
解决方案 SQL
WITH ranked_addresses AS ( SELECT Account., Client., Address, ROW_NUMBER() OVER ( PARTITION BY Client., Account. ORDER BY CASE Address WHEN 'Mailing' THEN 1 WHEN 'Domicile' THEN 2 ELSE 3 END ) AS address_rank FROM your_table_name ) SELECT Account., Client., Address FROM ranked_addresses WHERE address_rank = 1;
代码说明
- CTE 分组排序:通过
ROW_NUMBER()窗口函数,按Client.和Account.分组,给组内地址按优先级标记排名:Mailing排1(最高优先级),Domicile排2,其他地址排3。 - 筛选目标记录:主查询只保留每个分组中排名为1的记录,也就是符合需求的优先级最高的地址。
补充:如果同一组合下有多条相同优先级的地址(比如多条
Mailing)需要全部保留,可将ROW_NUMBER()替换为RANK();若需去重,可在主查询中添加DISTINCT。
内容的提问来源于stack exchange,提问作者cautis anca
相关产品推荐
相关产品推荐

