Spotfire:基于SOURCE层级按UWI-FORM组筛选单条记录
原始数据表格
| UWI | FORM | SOURCE | MD |
|---|---|---|---|
| 123 | BRAIDED | DRR | 100 |
| 123 | BRAIDED | ERK | 150 |
| 123 | BRAIDED | KPB | 200 |
| 123 | TUSCHER | DRR | 300 |
| 123 | TUSCHER | MDB | 350 |
| 123 | TUSCHER | KPB | 375 |
| 456 | BRAIDED | DRR | 150 |
| 456 | BRAIDED | KPB | 275 |
| 456 | TUSCHER | BTM | 500 |
| 456 | TUSCHER | DRR | 550 |
| 456 | TUSCHER | ERK | 525 |
解决方案方向
核心思路是给每个SOURCE手动分配优先级权重,结合窗口函数按UWI+FORM分组,取优先级最高的记录,既解决指定排名问题,新增SOURCE时只需补充权重规则即可,不会打乱现有层级。
方法1:CASE赋值优先级 + ROW_NUMBER()窗口函数
适配大多数SQL数据库(MySQL、SQL Server、PostgreSQL等):
WITH ranked_data AS ( SELECT UWI, FORM, SOURCE, MD, -- 按既定层级给SOURCE赋值,数字越小优先级越高 ROW_NUMBER() OVER ( PARTITION BY UWI, FORM ORDER BY CASE SOURCE WHEN 'ERK' THEN 1 WHEN 'MDB' THEN 2 WHEN 'DRR' THEN 3 WHEN 'KPB' THEN 4 WHEN 'BTM' THEN 5 -- 新增SOURCE时,在这里添加对应的优先级数字即可 ELSE 6 -- 未定义的SOURCE优先级最低 END ASC ) AS rank_num FROM your_table_name ) SELECT UWI, FORM, SOURCE, MD FROM ranked_data WHERE rank_num = 1;
- 逻辑说明:
CASE语句完全按照你指定的层级给SOURCE匹配优先级数字,不受字母排序影响;PARTITION BY UWI, FORM实现按这两个字段分组;ROW_NUMBER()给每组内的记录按优先级排序,rank_num=1就是每组里优先级最高的那条;- 新增SOURCE时,只需在
CASE分支里补充新规则,不会干扰原有层级。
方法2:临时优先级表关联查询(更易维护)
如果SOURCE层级后续可能频繁调整,可单独建配置表,避免修改主SQL:
- 创建并初始化优先级表(一次性操作):
CREATE TABLE source_priority ( SOURCE VARCHAR(10) PRIMARY KEY, priority INT NOT NULL ); INSERT INTO source_priority (SOURCE, priority) VALUES ('ERK', 1), ('MDB', 2), ('DRR', 3), ('KPB', 4), ('BTM', 5);
- 主查询逻辑:
WITH ranked_data AS ( SELECT t.UWI, t.FORM, t.SOURCE, t.MD, ROW_NUMBER() OVER ( PARTITION BY t.UWI, t.FORM ORDER BY COALESCE(sp.priority, 999) ASC ) AS rank_num FROM your_table_name t LEFT JOIN source_priority sp ON t.SOURCE = sp.SOURCE ) SELECT UWI, FORM, SOURCE, MD FROM ranked_data WHERE rank_num = 1;
- 优势:后续调整层级或新增SOURCE时,只需修改
source_priority表的数据,无需改动主查询,维护性更强。
预期结果表格
| UWI | FORM | SOURCE | MD |
|---|---|---|---|
| 123 | BRAIDED | ERK | 150 |
| 123 | TUSCHER | MDB | 350 |
| 456 | BRAIDED | DRR | 150 |
| 456 | TUSCHER | ERK | 525 |
内容的提问来源于stack exchange,提问作者Heather
相关产品推荐
相关产品推荐

