SQL Server 2008 R2 - Учетная запись за предыдущий день в лаге / CTE - Использовать значения из предыдущих или следующих строк - PullRequest
0 голосов
/ 29 августа 2018

Я следую руководству этого человека " Как использовать значения из предыдущих или следующих строк в запросе 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

enter image description here

...