我正在运行SQL Server 2012,这就是我需要的:
Row Field1 Field2
1 0 1
2 ? 2
3 ? -5
我需要一个逐行抛出的查询。 它应该采用row2,field1并将其设置为等于row1,field1 + row2,field2
然后它将采用row3,field1并将其设置为等于row2,field1 + row3,field2
最初,表中的Field1中的值都等于0,因此当我运行查询时,它总是使用0作为field1值。
任何帮助将不胜感激。我在想CTE是可行的方法,但我不知道该怎么做。
编辑: 在我的例子中,只是为了清理一些事情。初始输入是
Row Field1 Field2
1 0 1
2 0 2
3 0 -5
所需的输出是:
Row Field1 Field2
1 1 1
2 3 2
3 -2 -5
我的实际表格有点复杂,但我知道我可以专门应用它,如果我能理解如何通过这个例子来解决它。
答案 0 :(得分:3)
这是你需要的吗? (不清楚当你引用row2时,例如field1是指更新值之前或之后)
CREATE TABLE YourTable
(
Row INT,
Field1 INT NULL,
Field2 INT
)
INSERT INTO YourTable
VALUES (1,0,1),
(2,0,2),
(3,0,-5);
WITH CTE AS
(
SELECT *,
SUM(Field2) OVER (ORDER BY Row ROWS UNBOUNDED PRECEDING) AS RunningTotal
FROM YourTable
)
UPDATE CTE
SET Field1 = RunningTotal
SELECT *
FROM YourTable
最终结果
Row Field1 Field2
----------- ----------- -----------
1 1 1
2 3 2
3 -2 -5
或者对你的单词问题的另一种(更直接的)解释可能是
WITH CTE AS
(
SELECT *,
LAG(Field2) OVER (ORDER BY Row) AS PrevRowField2
FROM YourTable
)
UPDATE CTE
SET Field1 = PrevRowField2 + Field1
WHERE PrevRowField2 IS NOT NULL
答案 1 :(得分:1)
这样的改编自TSQL A recursive update?
With cte As (
Select
Row,
Field1,
Field2
From
t
Where
Row = 1
Union All
Select
t.Row,
t.Field2 + c.Field1,
t.Field2
From
t
Inner Join
cte c
On t.Row = c.Row + 1
)
Update
t
Set
Field1 = c.Field1
From
t
inner join
cte c
On t.Row = c.Row