1

我正在运行 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 

我的实际表格有点复杂,但我知道如果我能理解如何通过这个例子来实现它,我可以专门应用它。

4

2 回答 2

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
于 2012-12-23T21:57:54.983 回答
1

像这样改编自TSQL A 递归更新的东西?

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

http://sqlfiddle.com/#!6/cf843/1

于 2012-12-23T21:58:02.340 回答