如何创建列:同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
相关产品推荐
相关产品推荐

