T-SQL 更新前一行的语句

问题描述 投票:0回答:1

我有一个包含这 3 列的 SQL Server 表

Id, NetWeight, TransactionWeight

我需要用前一行的

NetWeight
+ 当前行的
Netweight
来更新当前行的
TransactionWeight
值。

UPDATE Table1
SET NetWeight = TransactionWeight + (previous row NetWeight)

我怎样才能实现这个目标?我尝试使用 CTE 和

LAG
函数,它仅正确更新第一行,因为 CTE 仅评估一次。

任何帮助表示赞赏。

sql t-sql sql-server-2012
1个回答
0
投票

解决该任务的一个简单方法是在更新命令中加入子查询或 CTE。

所以让我们根据您的问题创建一些示例数据:

CREATE TABLE yourtable (Id int, NetWeight int, TransactionWeight int);

INSERT INTO yourtable VALUES
(1,60,50),
(2,40,40),
(3,90,100),
(4,70,60),
(5,80,70),
(6,90,30),
(7,20,80);

那么你使用

LAG
的想法就可以了。以下查询...

SELECT
  id, NetWeight, TransactionWeight,
  TransactionWeight + COALESCE(LAG(NetWeight) OVER(ORDER BY id),0) AS newWeight
FROM yourtable
ORDER BY id;

...产生预期结果:

id 净重 交易权重 新重量
1 60 50 50
2 40 40 100
3 90 100 140
4 70 60 150
5 80 70 140
6 90 30 110
7 20 80 170

因此我们可以将此查询用作子查询或 CTE 并将其连接到表中以更新行:

WITH newWeights AS
  (SELECT
    id,
    TransactionWeight + COALESCE(LAG(NetWeight) OVER(ORDER BY id),0) AS newWeight
  FROM yourtable)
UPDATE y
  SET y.NetWeight = nw.newWeight 
FROM 
  yourtable y 
  INNER JOIN newWeights nw
    ON y.id = nw.id;

现在表格如下所示:

身份证 净重 交易权重
1 50 50
2 100 40
3 140 100
4 150 60
5 140 70
6 110 30
7 170 80

只剩下两件事需要检查,这取决于你:

  1. 您真的使用
    id
    列找到“上一行”或“下一行”还是使用另一列?
  2. 如果像我一样不存在前一行,您真的想将交易权重作为新权重吗?

检查这两个问题,必要时修改更新命令。

© www.soinside.com 2019 - 2024. All rights reserved.