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