我有一个带有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'
我建议使用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'
的含义,所以我没有包括这个逻辑。
尝试一下。
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