如何根据上一行和下一行的值更新记录
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;
下面是 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;