1

我有一张如下表。我想根据以下计算连续行之间的日期差异(以秒为单位):

  • 如果日期相差超过一天,那么我们继续计算差异
  • 如果日期相差超过一天,并且第二个日期的值为 84600 的连续天数,那么我想先合并日期,然后再计算差异

我目前正在做一个自加入来处理第一种情况,但不确定是否有处理第二种情况的好方法。有什么建议吗?

下面还举了一个例子:

CREATE TABLE #TEMP(Person VARCHAR(100), StartTime Datetime, TotalSeconds INT)


INSERT INTO #TEMP VALUES('A',   '2013-02-20',   49800); -- We want to take the difference with the next row in this case
INSERT INTO #TEMP VALUES('A',   '2013-02-25',   3000); -- Before taking the difference, I want to first merge the next four rows because 5th March is followed by three days with the value 86400
INSERT INTO #TEMP VALUES('A',   '2013-03-05',   2100); 
INSERT INTO #TEMP VALUES('A',   '2013-03-06',   86400);
INSERT INTO #TEMP VALUES('A',   '2013-03-07',   86400);
INSERT INTO #TEMP VALUES('A',   '2013-03-08',   86400);
INSERT INTO #TEMP VALUES('A',   '2013-03-09',   17100);
INSERT INTO #TEMP VALUES('B',   '2012-04-24',   22500);
INSERT INTO #TEMP VALUES('B',   '2012-04-26',   600);
INSERT INTO #TEMP VALUES('B',   '2012-04-27',   10500);
INSERT INTO #TEMP VALUES('B',   '2012-04-29',   41400);
INSERT INTO #TEMP VALUES('B',   '2012-05-04',   86100);


SELECT *
FROM #TEMP

DROP TABLE #TEMP
4

1 回答 1

2

下面处理第二种情况:

select Person, MIN(StartTime) as StartTime, MAX(StartTime) as maxStartTime
from (SELECT *,
             dateadd(d, - ROW_NUMBER() over (partition by person order by StartTime), StartTime) as thegroup
      FROM #TEMP t
     ) t
group by Person, thegroup

它将一个人的所有时间段分组,连续的日期合并为一个时间段(具有开始时间和结束时间)。诀窍是分配一个序列号,使用row_number()然后从StartTime. 对于一组连续的日期,这种差异是恒定的——因此外部group by.

您可以使用with语句将其放入查询中,然后在连续行之间获得所需的差异。

于 2013-04-18T15:11:50.933 回答