Aru*_*n.K 2 sql-server insert-update
我有一种情况,我需要用前一行值更新记录。
来源:
|MatId | BaseId |Flag|Pkg1| CS1
--------------------------------
|3001 | 3001 | 1 | 20 | 2 |
|3002 | 3001 | 0 | 15 | 3 |
|3003 | 3001 | 0 | 10 | 4 |
Run Code Online (Sandbox Code Playgroud)
这里 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|
Run Code Online (Sandbox Code Playgroud)
如上面的目标所示,我必须使用第一条记录 20 中的值更新 PKG1 中的两个值。此外,Pkg1 有许多列,如何使用单个查询更新所有列?
很感谢任何形式的帮助。
谢谢。
借助SQL Server 中的函数LEAD和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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12706 次 |
| 最近记录: |