SQL Server问题: 我的表中的数据可能如下所示:
Row Group Value
1 a 0
2 a 545
3 a 898
4 a 787
5 b 654
6 b 438
7 b 0
8 c 0
9 c 889
10 c 551
11 c 0
12 c 0
我想更新值= 0的行。规则是 - 如果组的第一行的值(即group = a row = 1)= 0,则使用该组的下一个值更新该值,即第2行值= 545.此规则仅适用于组的第一行和它必须= 0。
如果组中任何其他行的值(即group = b row = 6)= 0,则使用之前的值<>更新在该组中为0,直到所有值都为<> 0在该组的列表中工作。
我想在没有循环/游标等的情况下这样做。任何人都能看到一种方式吗?感谢。
最终结果应如下所示:
Row Group Value
1 a 545
2 a 545
3 a 898
4 a 787
5 b 654
6 b 438
7 b 438
8 c 889
9 c 889
10 c 551
11 c 551
12 c 551
答案 0 :(得分:1)
UPDATE t_base
SET [Value] = COALESCE(t_prev.[Value], t_next.[Value], t_base.[Value])
FROM MyTable t_base
CROSS APPLY (
SELECT TOP 1 [Value]
FROM MyTable
WHERE [Group] = t_base.[Group]
AND [Row] < t_base.[Row]
AND [Value] <> 0
ORDER BY [Row] DESC
) t_prev
CROSS APPLY (
SELECT TOP 1 [Value]
FROM MyTable
WHERE [Group] = t_base.[Group]
AND [Row] > t_base.[Row]
AND [Value] <> 0
ORDER BY [Row] ASC
) t_next