我在表#Temp1中具有以下数据列:(在Unit asc表上有一个现有的聚集索引,dateTime asc)
rowID unit dateTime newUnit dateDiff
1 A 2018-06-01 04:10 1 0
2 A 2018-06-01 04:12 0 2
3 A 2018-06-01 04:15 0 3
4 A 2018-06-01 04:15 0 0
5 A 2018-06-01 04:16 0 1
6 A 2018-06-01 04:17 0 1
7 B 2018-06-22 23:12 1 -305
8 B 2018-06-01 23:14 0 2
9 B 2018-06-01 23:18 0 4
10 B 2018-05-22 23:18 0 0
11 B 2018-06-01 23:22 0 4
12 B 2018-06-01 23:31 0 9
忽略第一行,当dateDiff为0时,我想将上一行值的dateTime增加2分钟。如果新的dateTime的值增加意味着它现在等于或大于下一行中的dateTime,则应增加下一个datetime并继续这样做,直到差值大于0。是单位的更改(newUnit = 1)。 dateDiff不需要使用新的差异进行更新。
接下来,我要基于rowID更新另一个表#Temp2,该表当前保存旧的dateTime值,并使用#Temp1中的新dateTime值。
在对S.O.我认为类似以下内容的方法可能有效,但是我不具备破解它的SQL知识!
WHILE (SELECT COUNT(*) FROM #Temp1) > 0
BEGIN
UPDATE TOP (1) #Temp2
SET [dateTime] = DATEADD(minute, 2, #Temp1.[dateTime])
FROM #Temp1
WHERE #Temp2.moveID = #Temp1.moveID + 1
.... plus other conditions to update [dateTime]
END
非常感谢您提供的有关破解此文件的帮助。
答案 0 :(得分:0)
您可以使用窗口功能和可更新的CTE:
with toupdate as (
select t.*,
row_number() over (partition by unit order by datetime) as seqnum,
min(datetime) over (partition by unit) as min_datetime
from #temp1 t
)
update toupdate
set datetime = dateadd(minute, 2 * seqnum - 2, min_datetime)
where seqnum > 1;
这将为每个unit
计算一个序列号。然后,它使用算术来设置每行中的datetime
值。