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

SQL需求:为数据表添加非空日期对应的下一阶段编号列

需求说明

需要为现有数据表新增Next_Stage列,该列展示当前行之后第一个STAGE_ENTERED_DATE不为null的STAGE_NO。

输入数据表

STAGE_NOSTAGE_ENTERED_DATE
02015-12-01 14:16:47
1null
2null
3null
4null
5null
62017-02-12 0:00:00
72017-12-12 0:00:00

期望输出结果

STAGE_NOSTAGE_ENTERED_DATENext_Stage
02015-12-01 14:16:476
1null6
2null6
3null6
4null6
5null6
62017-02-12 0:00:007
72017-12-12 0:00:00null

解决方案

通用SQL实现(适配MySQL 8.0+、SQL Server、PostgreSQL等)

WITH staged_data AS (
    SELECT 
        STAGE_NO,
        STAGE_ENTERED_DATE,
        -- 倒序窗口填充后续最近的非空阶段编号
        LAST_VALUE(CASE WHEN STAGE_ENTERED_DATE IS NOT NULL THEN STAGE_NO END) 
            OVER (ORDER BY STAGE_NO DESC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS next_stage_candidate
    FROM your_table_name
)
SELECT 
    STAGE_NO,
    STAGE_ENTERED_DATE,
    -- 对自身有非空日期的行,取下一个候选值;空日期行直接用候选值
    CASE 
        WHEN STAGE_ENTERED_DATE IS NOT NULL THEN 
            LEAD(next_stage_candidate) OVER (ORDER BY STAGE_NO)
        ELSE 
            next_stage_candidate
    END AS Next_Stage
FROM staged_data
ORDER BY STAGE_NO;

简洁版(支持IGNORE NULLS的数据库:PostgreSQL、Oracle等)

如果数据库支持窗口函数的IGNORE NULLS参数,可以直接用更简洁的写法:

SELECT 
    STAGE_NO,
    STAGE_ENTERED_DATE,
    LEAD(CASE WHEN STAGE_ENTERED_DATE IS NOT NULL THEN STAGE_NO END IGNORE NULLS) 
        OVER (ORDER BY STAGE_NO) AS Next_Stage
FROM your_table_name;

注:IGNORE NULLS会让LEAD自动跳过null值,直接定位到下一个非空的阶段编号。

内容的提问来源于stack exchange,提问作者Shru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:46:08