从未来行(日期和外键)更新行

时间:2017-05-22 14:05:19

标签: sql sql-server

我有一张这样的表:

ID    Date        regNum   NumA      NumB
1     1/1/2017    85       NULL       12
2     1/1/2017    86       NULL       13
3     1/1/2017    87       NULL       14
4     1/2/2017    85       NULL       15
5     1/3/2017    87       NULL       16
6     1/3/2017    88       NULL       17
7     1/7/2017    85       NULL       18
8     1/7/2017    86       NULL       19

我希望在下一个NumA中将NumB的{​​{1}}更新为Date

示例:适用于regNum ID = 1

修改

大多数answears只更新第一行,我想更新所有表格!

3 个答案:

答案 0 :(得分:1)

真正的问题是您的约会对象中是否有多个“下一个”日期。您的数据似乎有。

UPDATE MyTable t1
    SET NumA = (SELECT TOP 1 (NumB) 
                FROM MyTable t2
                WHERE t2.regNum = t1.regNum
                    AND t2.Date > t1.Date)
WHERE (SELECT COUNT(*)
       FROM MyTable t2
       WHERE t2.regNum = t1.regNum
           AND t2.Date > t1.Date) > 0

答案 1 :(得分:1)

您可以使用cte根据regNum的分区给出数据rownumbers,并按日期排序。然后加入cte自己找到“row_number +1”以获得下一个日期的NumB列。

db fiddle link

;WITH RankedData 
AS(
SELECT
    RegNum,
    [Date],
    ROW_NUMBER() OVER(PARTITION BY regNum ORDER BY [Date],ID) as GroupedRowNumber,
    NumB,
    ID
FROM
    MyTable)

UPDATE Base
SET
    NumA = Data2.NumB
FROM
    MyTable as Base
    INNER JOIN RankedData as Data1 ON
        Base.ID = Data1.ID
    INNER JOIN RankedData as Data2 ON
        Data1.RegNum = Data2.regNum AND
        Data1.GroupedRowNumber + 1 = Data2.GroupedRowNumber

答案 2 :(得分:0)

您可以自行加入并更新受影响的记录。

update    t1
set       NumA = t2.NumB
from      mytable t1
left join mytable t2
on        t1.regNum = t2.regNum
and       t2.[Date] = DATEADD(day,1,t1.[Date])
where     t2.NumB is not null;
GO
1 rows affected
select * from mytable;
GO
ID | Date                | regNum | NumA | NumB
-: | :------------------ | -----: | ---: | ---:
 1 | 01/01/2017 00:00:00 |     85 |   15 |   12
 2 | 01/01/2017 00:00:00 |     86 | null |   13
 3 | 01/01/2017 00:00:00 |     87 | null |   14
 4 | 02/01/2017 00:00:00 |     85 | null |   15
 5 | 03/01/2017 00:00:00 |     87 | null |   16
 6 | 03/01/2017 00:00:00 |     88 | null |   17
 7 | 07/01/2017 00:00:00 |     85 | null |   18
 8 | 07/01/2017 00:00:00 |     86 | null |   19

dbfiddle here