Oracle查询需求:保留最大Key的Type,匹配首个非空Number(从次大Key开始)
Oracle 查询实现方案
针对你的需求——保留最大key的key和type,同时获取次大key开始的首个非空number并合并结果,这里有两种简洁可靠的实现方式:
方案一:使用CTE(公共表达式)分步处理
这种方式逻辑清晰,便于维护,适合复杂场景扩展:
WITH ranked_records AS ( -- 给所有记录按key降序排号,最大key排第1,次大排第2 SELECT key, number, type, ROW_NUMBER() OVER (ORDER BY key DESC) AS record_rank FROM A ), max_key_details AS ( -- 提取最大key对应的key和type SELECT key, type FROM ranked_records WHERE record_rank = 1 ), first_valid_number AS ( -- 从次大key开始,找到第一条number非空的记录 SELECT number FROM ranked_records WHERE record_rank > 1 AND number IS NOT NULL ORDER BY record_rank FETCH FIRST 1 ROW ONLY ) -- 合并结果 SELECT m.key, f.number, m.type FROM max_key_details m CROSS JOIN first_valid_number f;
逻辑说明:
ranked_records:通过ROW_NUMBER()窗口函数给每条记录按key从大到小分配序号,确保最大的key排在第一位max_key_details:直接筛选序号为1的记录,拿到你需要保留的最大key和对应typefirst_valid_number:筛选序号大于1的记录(即次大及以后的),再过滤出number非空的,按序号升序取第一条就是首个符合要求的number- 最后用
CROSS JOIN把两个结果集合并成一行,得到你要的key number type格式结果
方案二:简洁子查询写法
如果你的场景比较简单,也可以用更紧凑的子查询写法,不需要CTE:
SELECT -- 获取最大key (SELECT key FROM A WHERE key = (SELECT MAX(key) FROM A)) AS key, -- 从小于最大key的记录中,找number非空且key最大的那条(即次大开始的首个非空) (SELECT number FROM A WHERE key < (SELECT MAX(key) FROM A) AND number IS NOT NULL ORDER BY key DESC FETCH FIRST 1 ROW ONLY) AS number, -- 获取最大key对应的type (SELECT type FROM A WHERE key = (SELECT MAX(key) FROM A)) AS type FROM dual;
额外提示:
- 如果存在多个并列最大key的情况(比如多条记录key都是2915935),可以把方案一中的
ROW_NUMBER()换成RANK(),这样所有最大key的记录都会被标记为序号1,避免遗漏 - 如果次大及以后的记录都没有非空
number,查询会返回number为null,你可以用NVL()函数设置默认值,比如NVL(f.number, '无有效值')
内容的提问来源于stack exchange,提问作者Sowndarya 18795
相关产品推荐
相关产品推荐

