Позволяет создавать тестовые данные
DECLARE @EventList TABLE
(
SOME_COLUMN_ID int,
SOME_COLUMN varchar(20),
SOME_TAG varchar(20),
SOME_TIMESTAMP datetime
)
INSERT INTO @EventList
(SOME_COLUMN_ID, SOME_COLUMN, SOME_TAG, SOME_TIMESTAMP)
VALUES
(1, 'Exporting', 'BEGIN', DATEADD(HOUR, -5, GETDATE())),
(1, 'Exporting', 'GOING', DATEADD(HOUR, -4, GETDATE())),
(1, 'Exporting', 'STILL_GOING', DATEADD(HOUR, -3, GETDATE())),
(1, 'Exporting', 'GONE', DATEADD(HOUR, -2, GETDATE())),
(1, 'Exporting', 'END', DATEADD(HOUR, -1, GETDATE())),
(2, 'Parsing1', 'BEGIN', DATEADD(HOUR, -5, GETDATE())),
(2, 'Parsing2', 'GOING', DATEADD(HOUR, -4, GETDATE())),
(2, 'Parsing3', 'STILL_GOING', DATEADD(HOUR, -3, GETDATE())),
(2, 'Parsing4', 'GONE', DATEADD(HOUR, -2, GETDATE()));
Теперь я собираюсь сделать КТР заказать события по времени и распределяли по ID
WITH T AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY SOME_COLUMN_ID ORDER BY SOME_TIMESTAMP) RN
FROM @EventList
)
Теперь мы будем тянуть все события находят одно после и получают продолжительность каждого шага, я также проверяю, удался ли процесс в END, иначе я использую время, чтобы найти продолжительность.
SELECT
T1.SOME_COLUMN_ID,
T1.SOME_COLUMN,
T1.SOME_TAG,
T1.SOME_TIMESTAMP AS BeginTime,
(CASE WHEN t1.SOME_TAG != 'END' THEN ISNULL(t2.SOME_TIMESTAMP, GETDATE()) ELSE NULL END) EndTime,
(CASE WHEN t1.SOME_TAG != 'END' THEN DATEDIFF(MINUTE, t1.SOME_TIMESTAMP, ISNULL(t2.SOME_TIMESTAMP, GETDATE())) ELSE NULL END) Duration
FROM T t1
LEFT JOIN T t2
ON t1.SOME_COLUMN_ID = t2.SOME_COLUMN_ID
AND t1.RN = t2.RN - 1
Вот результат:
SOME_COLUMN_ID SOME_COLUMN SOME_TAG BeginTime EndTime Duration
1 Exporting BEGIN 2014-12-18 05:31:06.090 2014-12-18 06:31:06.090 60
1 Exporting GOING 2014-12-18 06:31:06.090 2014-12-18 07:31:06.090 60
1 Exporting STILL_GOING 2014-12-18 07:31:06.090 2014-12-18 08:31:06.090 60
1 Exporting GONE 2014-12-18 08:31:06.090 2014-12-18 09:31:06.090 60
1 Exporting END 2014-12-18 09:31:06.090 NULL NULL
2 Parsing1 BEGIN 2014-12-18 05:31:06.090 2014-12-18 06:31:06.090 60
2 Parsing2 GOING 2014-12-18 06:31:06.090 2014-12-18 07:31:06.090 60
2 Parsing3 STILL_GOING 2014-12-18 07:31:06.090 2014-12-18 08:31:06.090 60
2 Parsing4 GONE 2014-12-18 08:31:06.090 2014-12-18 10:31:06.090 120
Это нормально вычислить разницу в другом месте. Однако, как я могу выбрать внутренний запрос? Я изменил вопрос, чтобы более точно описать проблему. – Atmocreations