You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑说明:

  1. ranked_records:通过ROW_NUMBER()窗口函数给每条记录按key从大到小分配序号,确保最大的key排在第一位
  2. max_key_details:直接筛选序号为1的记录,拿到你需要保留的最大key和对应type
  3. first_valid_number:筛选序号大于1的记录(即次大及以后的),再过滤出number非空的,按序号升序取第一条就是首个符合要求的number
  4. 最后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:18:43