Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DECLARE @sessionsCount int = 1;
- DECLARE @timeLimitBetweenSessions int = 300;
- IF OBJECT_ID('tempdb..#TestTable') IS NOT NULL DROP TABLE #TestTable
- SELECT
- a.Id, a.User_Id UserId1,
- b.User_Id UserId2,
- a.CreateDateTime StartActivity,
- b.CreateDateTime EndActivity,
- a.RowNum1,
- b.RowNum2,
- @sessionsCount as 'SessionNumber'
- INTO #TestTable
- FROM (
- select Id,
- User_Id ,
- CreateDateTime
- ,ROW_NUMBER() OVER (ORDER BY [User_Id], [CreateDateTime]) AS RowNum1
- from [dbo].[PageLoadings]) as a
- JOIN (
- SELECT [Id]
- ,[User_Id]
- ,[CreateDateTime]
- ,ROW_NUMBER() OVER (ORDER BY [User_Id], [CreateDateTime]) AS RowNum2
- FROM [dbo].[PageLoadings]) as b
- on a.RowNum1 = (b.RowNum2 - 1)
- UPDATE #TestTable SET
- SessionNumber =
- CASE WHEN UserId1 <> UserId2 THEN 0
- ELSE CASE WHEN DATEDIFF(SECOND, StartActivity, EndActivity) > @timeLimitBetweenSessions THEN 0
- ELSE @sessionsCount
- END
- END,
- @sessionsCount =
- CASE WHEN UserId1 <> UserId2 THEN @sessionsCount + 1
- ELSE
- CASE WHEN DATEDIFF(SECOND, StartActivity, EndActivity) > @timeLimitBetweenSessions THEN @sessionsCount + 1
- ELSE @sessionsCount
- END
- END;
- --Костыль для последней строки на случай, когда между последней и предпоследней сессий прошло > 5 минут
- WITH LastRecord AS
- (
- SELECT *
- FROM #TestTable
- WHERE RowNum2 = (SELECT MAX(RowNum2) FROM #TestTable)
- )
- UPDATE LastRecord SET SessionNumber =
- CASE WHEN SessionNumber = 0 THEN @sessionsCount
- ELSE 0
- END,
- StartActivity =
- CASE WHEN SessionNumber = 0 THEN EndActivity
- ELSE StartActivity
- END;
- UPDATE #TestTable SET EndActivity = DATEADD(minute, 5, EndActivity)
- WHERE EndActivity IN (SELECT max(EndActivity)
- FROM #TestTable
- WHERE SessionNumber <> 0
- GROUP BY SessionNumber)
- SELECT UserId2 as UserId, min(StartActivity) as StartActivity, max(EndActivity) as EndActivity FROM #TestTable
- WHERE SessionNumber <> 0
- GROUP BY SessionNumber, UserId2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement