t基于上一行日期值的sql增量日期列值

时间:2018-08-23 09:27:08

标签: sql tsql sql-server-2012

我在表#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

非常感谢您提供的有关破解此文件的帮助。

1 个答案:

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