【问题标题】:how to clean sql table base on startdate, enddate and effective date如何根据开始日期、结束日期和生效日期清理 sql 表
【发布时间】:2021-11-02 20:48:35
【问题描述】:

我有一个非常脏的表,其中混合了开始日期和一个值的更改生效日期。

表格是这样的

id value startdate enddate effective date
1 0.3 2020-10-07 2021-02-28 2020-07-01
1 1 2020-10-07 2021-02-28 2020-10-07
2 0.46 2021-01-01 2021-01-01
2 1 2021-01-01 2020-10-07 2021-05-01
3 1 2021-08-01 2021-08-01
4 1 2019-03-01 2019-03-01
4 0.5 2019-03-01 2020-08-01
4 0.7 2019-03-01 2021-05-01

当结束日期为空时,表示没有变更计划,当开始日期较晚且生效日期时,表示他们删除旧记录并创建具有其他值的新记录。

我的目标是清理桌子并将其整理成这样。

id value startdate_valid enddate_valid
1 0.3 2020-07-01 2020-10-07
1 1 2020-10-07 2021-02-28
2 0.46 2021-01-01 2021-05-01
2 1 2021-05-01
3 1 2021-08-01
4 1 2019-03-01 2020-08-01
4 0.5 2020-08-01 2021-05-01
4 0.7 2021-05-01

知道如何实现这一目标吗?

编辑:

我想我可以通过使用获得 startdate_validMAX([effective date]) OVER(PARTITION BY id, YEAR([effective date]), MONTH([effective date]) ORDER BY [effective date])

这是有道理的,因为我在effective date 中包含了startdate,但我仍然无法获得enddate_valid

【问题讨论】:

  • 您可能想在这里阅读:docs.microsoft.com/en-us/sql/t-sql/functions/…>
  • 非常感谢您的回答我查看了您与我共享的文档,但我无法看到延迟如何提供帮助,例如,对于我需要的 startdate_valid为 id 组排序 startdateeffective_date 之间的日期

标签: sql sql-server


【解决方案1】:

我找到了解决问题的方法,我需要分两步完成,所以如果有人有更好的解决方案,请分享,我会设置为正确的

SELECT 
    *,
    COALESCE(
        LEAD(sub.StartDate_value) OVER(PARTITION  BY sub.Code ORDER BY sub.StartDate_value), 
        sub.[startdate]) AS [EndDate_value] 
FROM (
             SELECT 
                   id, name,
                    COALESCE(
                        MAX([effective date]) OVER(PARTITION  BY id YEAR([effective date]), MONTH([effective date]) ORDER BY [effective date]),
                        startdate)
                        ) AS StartDate_value
             from table ) sub

【讨论】: