我有一个包含这 3 列的 SQL Server 表
Id, NetWeight, TransactionWeight
我需要用前一行的
NetWeight
+ 当前行的 Netweight
来更新当前行的 TransactionWeight
值。
UPDATE Table1
SET NetWeight = TransactionWeight + (previous row NetWeight)
我怎样才能实现这个目标?我尝试使用 CTE 和
LAG
函数,它仅正确更新第一行,因为 CTE 仅评估一次。
任何帮助表示赞赏。
解决该任务的一个简单方法是在更新命令中加入子查询或 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 |
只剩下两件事需要检查,这取决于你:
id
列找到“上一行”或“下一行”还是使用另一列?检查这两个问题,必要时修改更新命令。