Ключом к моему подходу является нахождение минимального значения даты для каждого идентификатора, который я называю ReferenceDate . Затем я присоединяюсь к основной таблице и выполняю математическое вычисление даты с помощью функции DATEDIFF () и преобразую результаты в чч: mi: ss с помощью CONVERT () *Функция 1008 * с использованием стиля 108 . Вот это dbfiddle .
IF OBJECT_ID('tempdb.dbo.#MyTable', 'U') IS NOT NULL
DROP TABLE #MyTable;
CREATE TABLE #MyTable
(
id INTEGER NOT NULL
, date DATETIME NOT NULL
);
INSERT INTO #MyTable (id, date) VALUES (2380, '10/30/12 09:00:00');
INSERT INTO #MyTable (id, date) VALUES (2380, '10/30/12 09:05:00');
INSERT INTO #MyTable (id, date) VALUES (2380, '10/30/12 09:10:00');
INSERT INTO #MyTable (id, date) VALUES (2380, '10/30/12 09:15:00');
INSERT INTO #MyTable (id, date) VALUES (2381, '10/30/12 10:00:00');
INSERT INTO #MyTable (id, date) VALUES (2381, '10/30/12 10:05:00');
INSERT INTO #MyTable (id, date) VALUES (2381, '10/30/12 10:10:00');
INSERT INTO #MyTable (id, date) VALUES (2381, '10/30/12 10:15:00');
INSERT INTO #MyTable (id, date) VALUES (2382, '10/30/12 11:00:00');
INSERT INTO #MyTable (id, date) VALUES (2382, '10/30/12 11:05:00');
INSERT INTO #MyTable (id, date) VALUES (2382, '10/30/12 10:10:00');
INSERT INTO #MyTable (id, date) VALUES (2382, '10/30/12 10:15:00');
INSERT INTO #MyTable (id, date) VALUES (2382, '10/30/12 12:15:00');
INSERT INTO #MyTable (id, date) VALUES (2382, '10/30/12 10:15:30');
SELECT a.*
, CONVERT(NVARCHAR(8), a.date - b.ReferenceDate, 108) AS duration
FROM #MyTable AS a
INNER JOIN (
SELECT id, MIN(date) AS ReferenceDate
FROM #MyTable GROUP BY id) AS b ON a.id = b.id;