Teradata中如何根据下一行起始日期计算当前行结束日期
Teradata实现分组排序后计算行截止日期的SQL方案
核心需求
- 数据按ID分组,组内按日期字段升序排列
- 每行的结束日期取同组下一行记录的日期减1天
- 分组内最后一条记录的结束日期取当前系统日期
实现逻辑
Teradata原生支持LEAD()窗口函数,可以直接在窗口内获取排序后的下一行字段值,无需自关联,性能更优,结合COALESCE()处理组内最后一行的空值即可。
基础SQL代码
SELECT ID, Date AS StartDate, COALESCE( LEAD(Date) OVER (PARTITION BY ID ORDER BY Date) - INTERVAL '1' DAY, CURRENT_DATE ) AS EndDate FROM 你的业务表名;
代码说明
LEAD(Date) OVER (PARTITION BY ID ORDER BY Date):按ID分区、日期升序排序后,提取当前行对应的下一行日期值,组内最后一行无下一条数据时,该表达式返回NULL- 减去
INTERVAL '1' DAY:将下一行日期减1天,对应当前行的截止日期,和示例中1月19日对应截止到1月24日、1月25日对应截止到1月25日的逻辑完全匹配 COALESCE():当LEAD返回NULL(即组内最后一行)时,取CURRENT_DATE作为结束日期
格式适配调整
如果需要和示例输出一致,将最后一行的结束日期显示为固定字符串CurrentDate而非实际日期值,可以使用如下写法:
SELECT ID, Date AS StartDate, COALESCE( CAST(LEAD(Date) OVER (PARTITION BY ID ORDER BY Date) - INTERVAL '1' DAY AS VARCHAR(20)), 'CurrentDate' ) AS EndDate FROM 你的业务表名;
针对题目给出的示例输入,上述代码运行结果完全匹配预期输出:
ID StartDate EndDate 1 1/19/2022 1/24/2022 1 1/25/2022 1/25/2022 1 1/26/2022 CurrentDate 2 2/1/2022 CurrentDate
注意事项
- 如果存储日期的字段是字符串类型(如示例中
M/D/YYYY格式的文本),需要先使用TO_DATE(Date, 'MM/DD/YYYY')转换为日期类型后,再做窗口计算和日期偏移 - 若组内存在重复日期,可在ORDER BY子句中补充其他排序字段保证排序顺序唯一,避免结果不确定
内容的提问来源于stack exchange,提问作者Aditya Daria
相关产品推荐
相关产品推荐

