使用下一个记录StartPeriodTime更新EndPeriodTime



我有一个带有StartPeriodTime和EndPeriodTtime的表,用于帮助同一帐户的不同版本。为该特定帐户添加新记录时,上一条记录EndPeriodTime应为新记录的StartPeriodTime。

目前它还没有更新,我需要应用一个更新来处理这个问题。唯一应该保留为默认值的EndPeriodTime应该是最新的记录。我已经想出了有效的代码,但它只是有时有效。

如果我一次将所有文件加载到表中,效果会很好。如果我一次加载一个文件的表,它就会失败,因为它得到了null。我需要帮助写这篇文章,使它不会拾取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