根据一行中的列值添加列

时间:2015-03-11 10:40:43

标签: sql sql-server sql-server-2008

我在这张表中包含以下数据

user     Date        Dist     Start
 1     2014-09-03     150       12500
 1     2014-09-04     220       null
 1     2014-09-05     100       null
 2     2014-09-03     290       18000
 2     2014-09-04     90        null
 2     2014-09-05     170       null

根据Start Column中的值,我需要添加另一列,如果不为同一用户的null,则重复该值 结果表应如下所示

 user     Date        Dist     Start            StartR
 1     2014-09-03     150       12500          12500
 1     2014-09-04     220       null           12500
 1     2014-09-05     100       null           12500
 2     2014-09-03     290       18000          18000
 2     2014-09-04     90        null           18000
 2     2014-09-05     170       null           18000

有人可以帮我解决这个问题吗?因为我不知道我该怎么做

2 个答案:

答案 0 :(得分:1)

对于您拥有的数据,您可以使用窗口功能:

select t.*, min(t.start) over (partition by user) as StartR
from table t

您可以使用相同的想法轻松更新:

with toupdate as (
      select t.*, min(t.start) over (partition by user) as new_StartR
      from table t
     )
update toupdate
    set StartR = new_StartR;

注意:这适用于问题中的数据以及您如何表达问题。如果给定的Start有多个user值,或者在第一个非NULL NULL值之前要保留Start个值,则无效

答案 1 :(得分:1)

您可以使用COALESCE / ISNULL和相关的子查询:

SELECT [user], [Date], [Dist], [Start],
       StartR = ISNULL([Start], (SELECT MIN([Start])
                                 FROM dbo.TableName t2
                                 WHERE t.[User] = t2.[User]
                                 AND  t2.[Start] IS NOT NULL))
FROM dbo.TableName t

我使用了MIN([Start]),因为如果一个用户的Start值不是NULL,则说明会发生什么。