使用下一个记录StartPeriodTime更新EndPeriodTime

问题描述 投票:0回答:2

我有一个带有StartPeriodTime和EndPeriodTtime的表,以帮助分离同一帐户的版本。当为该特定帐户添加新记录时,先前的记录EndPeriodTime应该是新记录的StartPeriodTime。

当前,它不是正在更新,我需要应用一个更新,使我能够处理此更新。应该保留为默认值的唯一EndPeriodTime应该是最新记录。我想出了可以运行的代码,但有时只能运行。

如果我要一次加载所有文件的表,那么效果很好。如果我要一次加载一个表,则该文件将失败,因为它获取了空值。我需要帮助将此内容写到不包含null的地方。如果有人可以为我提供可行的解决方案,我甚至愿意以另一种方式编写。我的代码如下:

UPDATE ods.CustomerPayment
    SET EndPeriodTime = (
        SELECT MIN(t2.EndPeriodTime)
        FROM ods.CustomerPayment t2
        WHERE t2.CustomerNumber = t1.CustomerNumber
        AND t2.StartPeriodTime > t1.StartPeriodTime
    )
FROM ods.CustomerPayment t1
WHERE t1.EndPeriodTime != '1999-01-01 00:00:00.000'
sql sql-server sql-update versioning
2个回答
0
投票

我建议使用lag()和可更新的CTE:

with toupdate as (
      select cp.*,
            lead(startperiodtime) over (partition by CustomerNumber) as next_startperiodtime
      from ods.CustomerPayment cp
     )
    set endperiodtime = next_startperiodtime
    where (endperiodtime <> next_startperiodtime or endperiodtime is null) and
          endperiodtime <> '1999-01-01';

您没有解释'1999-01-01 00:00:00.000'的含义,所以我没有包括这个逻辑。


0
投票

尝试一下。

update ods.CustomerPayment 
set EndPeriodTime = t1.EndPeriodTime2
from 
    (select t.EndPeriodTime as EndPeriodTime2, t.CustomerNumber as CustomerNumber2 from 
        (select row_number() over (order by EndPeriodTime desc) rn
            , EndPeriodTime
            , CustomerNumber
            from ods.CustomerPayment) t
        where t.rn = 2) t1
where  EndPeriodTime != '1999-01-01 00:00:00.000'
    and CustomerNumber = t1.CustomerNumber2 
© www.soinside.com 2019 - 2024. All rights reserved.