• This turned out to be much trickier than I thought. I figured out a way to do it in two passes. May not be optimal and I didn't have time to do a lot of testing, but here's what I got:

    IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL

    DROP TABLE #TempTable

    CREATE TABLE #TempTable (

    [ID] INT IDENTITY(1,1) NOT NULL,

    [SomeDate] DATETIME NULL,

    PRIMARY KEY (ID))

    INSERT INTO #TempTable

    (SomeDate)

    VALUES

    ('2013-03-02 13:40:00'),

    ('2013-03-02 14:10:00'),

    ('2013-03-02 14:20:00'),

    ('2013-03-02 14:30:00'),

    ('2013-03-02 14:50:00'),

    ('2013-03-02 15:00:00'),

    ('2013-03-02 16:20:00'),

    ('2013-03-02 17:20:00'),

    ('2013-03-02 17:30:00'),

    ('2013-03-02 17:50:00'),

    ('2013-03-02 18:00:00'),

    ('2013-03-02 19:20:00'),

    ('2013-03-02 19:30:00')

    IF OBJECT_ID('tempdb..#ResultTable') IS NOT NULL

    DROP TABLE #ResultTable

    CREATE TABLE #ResultTable (

    [ID] INT IDENTITY(1,1) NOT NULL,

    [SomeDate] DATETIME NULL,

    [Diff] INT NULL,

    PRIMARY KEY (ID))

    INSERT INTO #ResultTable

    SELECT

    SomeDate

    ,(CASE

    WHEN ID = 2 THEN DATEPART(minute,SomeDate)

    WHEN Diff > 60 THEN Diff-60

    WHEN Diff = 60 THEN DATEPART(minute,SomeDate)

    ELSE Diff

    END) AS Diff

    FROM

    (

    SELECT

    t1.ID

    ,t1.SomeDate

    ,t2.ID AS ID2

    ,t2.SomeDate AS SomeDate2

    ,ISNULL(DATEDIFF(minute,t2.SomeDate,t1.SomeDate),0) Diff

    FROM

    #TempTable t1

    LEFT JOIN

    #TempTable t2

    ON t1.ID = t2.ID + 1

    ) R

    --SELECT * FROM #ResultTable AS rt

    ;MERGE INTO #ResultTable AS [Target]

    USING

    (

    SELECT

    MAX(R.ID) OVER (PARTITION BY 1)+2 AS ID

    ,(CASE

    WHEN R.ID = 1 THEN DATEADD(hour,1,DATEADD(minute,-DATEPART(minute,SomeDate),SomeDate))

    ELSE DATEADD(minute,-DATEPART(minute,SomeDate),SomeDate)

    END) AS SomeDate

    ,(CASE

    WHEN R.ID = 1 THEN DATEDIFF(minute,SomeDate,DATEADD(minute,60-DATEPART(minute,SomeDate),SomeDate))

    WHEN DATEDIFF(minute,SomeDate2,SomeDate) > 60 THEN 60

    WHEN DATEDIFF(minute,SomeDate2,SomeDate) = 60 THEN DATEDIFF(minute,SomeDate2,DATEADD(minute,-DATEPART(minute,SomeDate),SomeDate))

    ELSE DATEDIFF(minute,SomeDate2,SomeDate)

    END) AS Diff

    FROM

    (

    SELECT

    t1.ID

    ,t1.SomeDate

    ,t2.ID AS ID2

    ,t2.SomeDate AS SomeDate2

    ,ISNULL(DATEDIFF(minute,t2.SomeDate,t1.SomeDate),0) Diff

    FROM

    #TempTable t1

    LEFT JOIN

    #TempTable t2

    ON t1.ID = t2.ID + 1

    ) R

    WHERE

    Diff >= 60

    OR ID = 1

    ) AS [Source]

    ON [Target].ID = [Source].ID

    WHEN MATCHED AND [Source].Diff >= 60

    THEN UPDATE

    SET

    SomeDate = [Source].SomeDate

    ,Diff = [Source].Diff-60

    WHEN NOT MATCHED BY TARGET

    THEN INSERT

    (

    SomeDate

    ,Diff

    )

    VALUES

    (

    DATEADD(minute,DATEPART(minute,[Source].SomeDate),[Source].SomeDate)

    ,[Source].Diff

    );

    SELECT

    SomeDate

    ,Diff

    FROM

    #ResultTable

    ORDER BY

    SomeDate