Я следую руководству этого человека " Как использовать значения из предыдущих или следующих строк в запросе SQL Server ".
Вот основной запрос, который он использует:
;WITH UserActivityWRowNum(RowNumber, User, Activity, ActivityTime, ActivityDate)
AS
(
SELECT ROW_NUMBER()OVER(ORDER BY user, ActivityTime) RowNumber
,User
,Activity
,ActivityTime
,CAST(ActivityTime as DATE) as ActivityDate
FROM dbo.UserActivity
SELECT LogOns.User, LogOns.ActivityDate
,LogOffs.ActivityTime LogOff
,LogOns.ActivityTime LogOn
, DATEDIFF(minute, LogOffs.ActivityTime, LogOns.ActivityTime) IdleTime
FROM (SELECT * FROM UserActivityWRowNum WHERE Activity='LogOn') LogOns
JOIN (SELECT * FROM UserActivityWRowNum WHERE Activity='LogOff') LogOffs
ON LogOffs.RowNumber=LogOns.RowNumber - 1
AND LogOffs.User - LogOns.User
AND LogOffs.ActivityDate - LogOns.ActivityDate
Я пытаюсь учесть дни, когда у пользователя был цикл входа / выхода из системы между двумя днями. Это затрудняет подсчет общего времени простоя в день. По сути, как мне учесть цикл выхода из системы / входа в систему, который охватывает два дня и дает общее время простоя для определенного дня? Общее время простоя в день на пользователя является ожидаемым результатом, как указано в ссылке
Например, на изображении ниже показано действие по выходу из системы в строке 6. Таким образом, технически пользователь простаивал в течение оставшихся 7 часов этого дня (2013-01-01). 2013-01-02 будет иметь фиктивный выход из системы в качестве первой записи, которая будет отображаться как 2013-01-02 00: 00: 00