Некоторые предположения:
- Работа всегда начинается и заканчивается в один и тот же день? Важно для подсчета.
- Уникальная комбинация activity / usr_id / year / month / lodnum / wh_id определяет «одну» работу
Сообщите нам, правильно ли это?
Возможное решение:
Сначала я построил CTE (Common Table Expression), который добавляет два столбца:
- столбец времени [Row], определяющий порядок заданий, на основе комбинации уникальных столбцов. Результаты в 1 и 2: начало и конец работы.
- [Ключ] создание ключа на основе комбинации уникальных столбцов для последующего соединения.
Во-вторых, я присоединяюсь к двум версии CTE: один с фильтром на [Row] = 1 (начало задания), который присоединяется ко второму на [Key] и [Row] = 2. Затем вычисляет разницу в секундах.
WITH CTE AS (
SELECT
[activity]
,[usr_id]
,[year]
,[month]
,[day]
,[time]
,[lodnum]
,[wh_id]
,ROW_NUMBER() OVER (PARTITION BY activity, usr_id, year, month, day, lodnum, wh_id ORDER BY [time]) as [Row]
,RANK() OVER (ORDER BY activity, usr_id, year, month, day, lodnum, wh_id) as [Key]
FROM [dbo].[JobActivities] )
SELECT
StartTime.usr_id,
StartTime.activity,
StartTime.day,
StartTime.time as [Start Time],
EndTime.time as [End Time],
DATEDIFF(SECOND, StartTime.time, EndTime.time) as [Difference (s)]
FROM
CTE StartTime
LEFT OUTER JOIN CTE EndTime ON StartTime.[Key] = EndTime.[Key] AND EndTime.Row = 2
WHERE StartTime.Row = 1
ORDER BY StartTime.day, StartTime.time
Решение 2. Использование LEAD (без соединения, лучшая производительность):
WITH CTE AS (
SELECT [Row Num]
,[activity]
,[usr_id]
,[year]
,[month]
,[day]
,[time] [Start Time]
,[lodnum]
,[wh_id]
,ROW_NUMBER() OVER (PARTITION BY activity, usr_id, year, month, day, lodnum, wh_id ORDER BY [time]) as [Row]
,LEAD([time]) OVER (PARTITION BY activity, usr_id, year, month, day, lodnum, wh_id ORDER BY [time]) AS [End Time]
FROM [dbo].[JobActivities] )
SELECT
usr_id,
activity,
day,
[Start Time],
[End Time],
DATEDIFF(SECOND, [Start Time], [End Time]) as [Difference (s)]
FROM
CTE
WHERE Row = 1
ORDER BY day, [Start Time]