如何根据上一行和下一行的值更新记录

How to Update a record Based on the the values on Previous row and Next Row

下面是 table,其中包含列 uniqueid Number、Complete date 和 User id。以下数据按用户ID、完成日期排序。

如果前一行和 null 之后的行具有相同的编号,我想将 Uniqueid =456 的编号列更新为 'xxxx 1111'。如果上一行或之后的行为空或不同,则不更新。

基本上,我想按用户 ID、完成日期对行进行排序,识别为空的行并检查前一行和空记录之后的行,并使用与前一行和前一行相同的编号更新空记录在拥有之后。如果两者不匹配,则将其 NULL 记录留空。谢谢。

原创

UniqueId Number        Complete date                UserId
----------------------------------------------------------
123      xxxx 1111     2022-03-17 11:19:07.000      11011
456       NULL         2022-03-17 11:22:50.000      11011
789      xxxx 1111     2022-03-17 11:28:32.000      11011

预期输出:

UniqueId  Number       Complete date                UserId
----------------------------------------------------------
123     xxxx 1111      2022-03-17 11:19:07.000      11011
456     xxxx 1111      2022-03-17 11:22:50.000      11011
789     xxxx 1111      2022-03-17 11:28:32.000      11011

SQL 服务器 2017 - T-SQL

我已经尝试了分区、最小值和最大值,但无法找到我想要的。

select 
    UserId, completedate, number,   
    newremarks = max(userid) over (partition by number order by userid, completedate)
from 
    foo
order by 
    userId, CompleteDate

我尝试了类似于上面显示的代码。

您可以在此处使用 lag & lead 和可更新的 CTE:

with n as (
    select *, 
        Lag(number) over(partition by UserId order by [Complete date]) pn,
        Lead(number) over(partition by UserId order by [Complete date]) nn
    from t
)
update n set number = pn
from n
where pn = nn and number is null;

See Demo Fiddle