Hi @jahanzaib rahman
Check this:
;WITH CTE AS
(
SELECT AccountId,UtcActionDate AS [Login Start],
LEAD(UtcActionDate,1,null)OVER(PARTITION BY AccountId ORDER BY UtcActionDate) [Login End],ActionType
FROM #logstable
WHERE (ActionType='Login' AND ActionSubType='LoginSuccess' ) OR (ActionType='Logout'AND ActionSubType='LogoutSuccess' )
)
SELECT AccountId,[Login Start],[Login End],
CAST((DATEPART(HOUR,[Login End]) - DATEPART(HOUR,[Login Start]))AS VARCHAR)+' h '+CAST((DATEPART(MI,[Login End]) - DATEPART(MI,[Login Start]))AS VARCHAR)+' m ' AS TimeSpent
FROM CTE
WHERE ActionType='Login'
However, as Erland said, the query above only make sence when login and logout are arranged strictly one by another.
To avoid this issue,you could try this query:
;WITH CTE1 AS
(
SELECT *,LAG(ActionType,1,'Logout')OVER(PARTITION BY AccountId ORDER BY UtcActionDate) PreActionType,
LEAD(ActionType,1,'Login')OVER(PARTITION BY AccountId ORDER BY UtcActionDate) NextActionType
FROM #logstable
),CTE2 AS(
SELECT *,LEAD(UtcActionDate)OVER(PARTITION BY AccountId ORDER BY UtcActionDate)AS [Login End]
FROM CTE1
WHERE (ActionType='Login' AND ActionSubType='LoginSuccess' AND PreActionType='Logout')
OR (ActionType='Logout' AND ActionSubType='LogoutSuccess' AND NextActionType='Login')
)
SELECT AccountId,UtcActionDate AS [Login Start],[Login End],
CAST((DATEPART(HOUR,[Login End]) - DATEPART(HOUR,UtcActionDate))AS VARCHAR)+' h '+CAST((DATEPART(MI,[Login End]) - DATEPART(MI,UtcActionDate))AS VARCHAR)+' m ' AS TimeSpent
FROM CTE2
WHERE ActionType='Login'
Best regards,
LiHong