用前一行更新记录
Update record with previous row
我有一种情况需要用前一行值更新记录。
来源:
|MatId | BaseId |Flag|Pkg1| CS1
--------------------------------
|3001 | 3001 | 1 | 20 | 2 |
|3002 | 3001 | 0 | 15 | 3 |
|3003 | 3001 | 0 | 10 | 4 |
这里3001(MatID
)和3001(BaseID
)相同所以FLAG
=1,下一条记录只有BASEID
相同。输出应 仅 PKG1
字段更新为当前行值。
目标或输出:
|MatId | BaseId|Flag|Pkg1|CS1
------------------------------
|3001 | 3001 | 1 | 20 | 2|
|3002 | 3001 | 0 | 20 | 3|
|3003 | 3001 | 0 | 20 | 4|
如上面的目标所示,我必须用第一个记录 20 中的值更新 PKG1 中的两个值。Pkg1 也有很多列,如何使用单个查询更新所有列?
非常感谢任何帮助。
谢谢。
借助 SQL 服务器中的 LEAD
and LAG
函数获取上一个和下一个值非常简单。如果您使用的 SQL Server 版本低于 2012,它不支持 LEAD
和 LAG
功能,我们可以使用 ROW_NUMBER()
.
尝试使用这样的东西:
;WITH t AS
(
select LAG(MatId) OVER (ORDER BY MatId) AS previousMatId
, BaseId
, MatId
from TABLE
)
update tab
set tab.Pkg1 = p.Pkg1
from TABLE tab
inner join t on tab.MatId = t.MatId and t.BaseId = t.previousMatId
left join (select MatId AS MatId
, ISNULL(LAG(Pkg1) OVER (ORDER BY MatId), Pkg1) AS Pkg1
from TABLE) p on t.MatId = p.MatId
你是说较新的垫子需要用属于原始垫子的 Pkg1 更新吗?如果是这样,它将是:
update NewMats
set NewMats.Pkg1 = Base.Pkg1
from MyTabe as NewMats
inner join (select BaseId, Pkg1
from MyTable
where BaseId = MatId) as Base
on Base.BaseId = NewMats.BaseId
where NewMats.BaseId < NewMats.MatId
但是如果是这种情况,那么你的数据模型就需要改变了。规则是一条给定的信息应该只存在于一个地方。所以也许把它分成 2 个相关的表。
我有一种情况需要用前一行值更新记录。
来源:
|MatId | BaseId |Flag|Pkg1| CS1
--------------------------------
|3001 | 3001 | 1 | 20 | 2 |
|3002 | 3001 | 0 | 15 | 3 |
|3003 | 3001 | 0 | 10 | 4 |
这里3001(MatID
)和3001(BaseID
)相同所以FLAG
=1,下一条记录只有BASEID
相同。输出应 仅 PKG1
字段更新为当前行值。
目标或输出:
|MatId | BaseId|Flag|Pkg1|CS1
------------------------------
|3001 | 3001 | 1 | 20 | 2|
|3002 | 3001 | 0 | 20 | 3|
|3003 | 3001 | 0 | 20 | 4|
如上面的目标所示,我必须用第一个记录 20 中的值更新 PKG1 中的两个值。Pkg1 也有很多列,如何使用单个查询更新所有列?
非常感谢任何帮助。
谢谢。
借助 SQL 服务器中的 LEAD
and LAG
函数获取上一个和下一个值非常简单。如果您使用的 SQL Server 版本低于 2012,它不支持 LEAD
和 LAG
功能,我们可以使用 ROW_NUMBER()
.
尝试使用这样的东西:
;WITH t AS
(
select LAG(MatId) OVER (ORDER BY MatId) AS previousMatId
, BaseId
, MatId
from TABLE
)
update tab
set tab.Pkg1 = p.Pkg1
from TABLE tab
inner join t on tab.MatId = t.MatId and t.BaseId = t.previousMatId
left join (select MatId AS MatId
, ISNULL(LAG(Pkg1) OVER (ORDER BY MatId), Pkg1) AS Pkg1
from TABLE) p on t.MatId = p.MatId
你是说较新的垫子需要用属于原始垫子的 Pkg1 更新吗?如果是这样,它将是:
update NewMats
set NewMats.Pkg1 = Base.Pkg1
from MyTabe as NewMats
inner join (select BaseId, Pkg1
from MyTable
where BaseId = MatId) as Base
on Base.BaseId = NewMats.BaseId
where NewMats.BaseId < NewMats.MatId
但是如果是这种情况,那么你的数据模型就需要改变了。规则是一条给定的信息应该只存在于一个地方。所以也许把它分成 2 个相关的表。