sqlsql-serverisqlquery

Sum the timegap if consecutive timestamps are same for 10 min


i am using the below query to find the null values of a column and get the starttime and endtime of the null values using the below query for some 30,000 rows

    SELECT
    yt1.[timestamp] AS StartTime,
    MIN(yt2.[timestamp]) AS EndTime,
    DATEDIFF(MINUTE, yt1.[timestamp], MIN(yt2.[timestamp])) AS DifferenceInMinutes
    FROM
    Sheet1$ yt1
    LEFT JOIN Sheet1$ yt2 ON yt1.[timestamp] < yt2.[timestamp]
    WHERE
    yt1.TWSPD IS NULL
    GROUP BY yt1.[timestamp]

The output is

Start time                     Endtime                DifferenceInMinutes
2012-05-18 20:47:03.000    2012-05-18 20:57:04.000      10
2012-05-18 20:57:04.000    2012-05-18 21:07:04.000      10
2012-05-21 18:25:26.000    2012-05-21 18:35:26.000      10
2012-06-07 17:36:28.000    2012-06-07 17:46:28.000      10
2012-06-07 17:46:28.000    2012-06-07 17:56:28.000      10
2012-06-07 17:56:28.000    2012-06-07 18:06:28.000      10

And for example now i need the output as (removed some row to display better)

Start time                     Endtime                DifferenceInMinutes
2012-05-18 20:47:03.000    2012-05-18 21:07:04.000      20
2012-05-21 18:25:26.000    2012-05-21 18:35:26.000      10
2012-06-07 17:36:28.000    2012-06-07 18:06:28.000      30

The timestamp is for every 10 min, if the null values for consecutive 10min timegap should be added and the starttime and endtime should be displayed as from the first null to last null of consecutive timestamp. Hope the question is clear. Please let me know if i am not clear. Please help


Solution

  •  SELECT
        yt1.[timestamp] AS StartTime,
        MIN(yt2.[timestamp]) AS EndTime,
        DATEDIFF(MINUTE, yt1.[timestamp], MIN(yt2.[timestamp])) AS DifferenceInMinutes
        into #tmp1
        FROM
        Sheet1$ yt1
        LEFT JOIN Sheet1$ yt2 ON yt1.[timestamp] < yt2.[timestamp]
        WHERE
        yt1.TWSPD IS NULL
        GROUP BY yt1.[timestamp]
    
    
    Select t1.* 
    into #tmp2
    from #tmp1 t1
    left join #tmp1 t2 on t1.Starttime=t2.Endtime
    where t2.Endtime is null
    
    Declare @rcn int
    Select @rcn=1
    While @rcn>0
        begin
           Update #tmp2 set #tmp2.Endtime=t.endTime,#tmp2.DifferenceInMinutes=#tmp2.DifferenceInMinutes+t.DifferenceInMinutes
           from #tmp1 t
           where t.Starttime=#tmp2.Endtime
           select @rcn=@@Rowcount
        end
    
    
    select * from #tmp2
    
    Drop Table #tmp1
    Drop Table #tmp2