【发布时间】:2021-04-13 22:25:44
【问题描述】:
我有下表:
CREATE TABLE dbo.Persons
(
[Date] date null,
[PersonId] int null,
[Amount] int null,
[Value] int null
)
这里有一些示例数据:
INSERT INTO dbo.Persons ([Date], [PersonId], [Amount], [Value])
VALUES
('2020-01-01', 1, 200, NULL),
('2020-01-02', 1, 300, NULL),
('2020-01-03', 1, 400, NULL),
('2020-01-04', 1, 500, NULL),
('2020-01-01', 2, 200, NULL),
('2020-01-02', 2, 300, NULL),
('2020-01-03', 2, 400, NULL),
('2020-01-04', 2, 500, NULL),
('2020-01-01', 3, 0, NULL),
('2020-01-02', 3, 0, NULL),
('2020-01-03', 3, 0, NULL),
('2020-01-04', 3, 0, NULL)
我的目标:根据其他列中的值和 [Value] 列中的先前值更新 [Value] 列中的所有值。主键是date+personId。
用伪代码解释,我的逻辑需要如下:
CASE
WHEN [Amount] > 200 AND previous row value IN [Value] = 1, then 2
WHEN [Amount] > 500 AND previous row value in [Value] = 2, then 3
WHEN [Date] > '2020-01-01' AND [Amount] = 500 AND previous row value in [Value] = 2, then 4
等等 - 这捕获了一般的 T-SQL 代码逻辑..
我只想更新 [Value] 列,其中 [Value] 也是 NULL。
这里有什么戏?我读过有关使用 LAG、While LOOP、递归 CTE 等的信息,但不确定该去哪里。
【问题讨论】:
标签: sql-server tsql recursion sql-update