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

如何创建列:同ID下取值为另一列下一行值,末行设默认值

解决方案:生成end_date列(同ID下取下一行start_date,最后一行设默认值)

核心思路是利用**窗口函数LEAD()**实现同ID范围内获取下一行的start_date,再通过空值替换函数将最后一行的空值替换为默认日期01/01/1999。

关键前提

必须保证数据按ID分区后,start_date是有序的,因此ORDER BY start_date是必要条件,避免出现下一行日期逻辑错误。


1. 支持窗口函数的数据库(MySQL 8.0+/PostgreSQL/SQL Server等)

MySQL 8.0+

SELECT 
    ID,
    start_date,
    COALESCE(LEAD(start_date) OVER (PARTITION BY ID ORDER BY start_date), '01/01/1999') AS end_date
FROM your_table;

PostgreSQL

SELECT 
    ID,
    start_date,
    COALESCE(LEAD(start_date) OVER (PARTITION BY ID ORDER BY start_date), '1999-01-01'::DATE) AS end_date
FROM your_table;

注:PostgreSQL建议使用标准日期格式YYYY-MM-DD,若原表日期格式为DD/MM/YYYY,可通过TO_DATE(start_date, 'DD/MM/YYYY')转换后再排序。

SQL Server

SELECT 
    ID,
    start_date,
    ISNULL(LEAD(start_date) OVER (PARTITION BY ID ORDER BY start_date), '01/01/1999') AS end_date
FROM your_table;

2. 不支持窗口函数的旧版MySQL(5.x及以下)

使用自连接+子查询实现:

SELECT 
    t1.ID,
    t1.start_date,
    COALESCE(t2.start_date, '01/01/1999') AS end_date
FROM your_table t1
LEFT JOIN your_table t2 
    ON t1.ID = t2.ID 
    AND t2.start_date = (
        SELECT MIN(start_date) 
        FROM your_table 
        WHERE ID = t1.ID AND start_date > t1.start_date
    )
ORDER BY t1.ID, t1.start_date;

内容的提问来源于stack exchange,提问作者data-geek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:07:00