我有一张这样的表:
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只更新第一行,我想更新所有表格!
答案 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列。
;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