Oracle数据库ZAP_TEST_AP表按优先级筛选目标行的SQL查询问题
Oracle SQL 实现方案
你可以通过窗口函数ROW_NUMBER()实现分组优先级排序取数,具体语句如下:
SELECT A1, B1, C1 FROM ( SELECT t.*, ROW_NUMBER() OVER ( PARTITION BY t.C1 ORDER BY CASE WHEN t.A1 IS NOT NULL AND t.B1 IS NOT NULL THEN 1 WHEN t.A1 IS NOT NULL AND t.B1 IS NULL THEN 2 WHEN t.A1 IS NULL AND t.B1 IS NOT NULL THEN 3 END ASC, ROWID ASC -- 同优先级按原表行顺序取数,匹配你预期的原行号结果 ) AS rn FROM ZAP_TEST_AP t WHERE t.A1 IS NOT NULL OR t.B1 IS NOT NULL -- 直接过滤全空行,对应全空组不返回的要求 ) WHERE rn = 1;
逻辑说明
PARTITION BY C1实现按host字段分组- CASE语句完全匹配你要求的优先级规则,数值越小优先级越高
- 内层WHERE条件提前筛除A1、B1全为空的行,避免无效数据参与排序
- 外层取
rn=1的行,就是每组按规则选出的唯一一行,和你预期的原行号1、4、7、9的结果完全匹配
内容的提问来源于stack exchange,提问作者Angelo Pisaturo
相关产品推荐
相关产品推荐

