如何使用上面或下面的行中的值进行更新

时间:2013-11-26 19:02:25

标签: sql sql-server

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

1 个答案:

答案 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