sql saves the day

masen, 04 April 2013

Finally cracked the nut on a problem I've been working on: trying to determine from a login event and a record of logins and logouts whether that login event constitutes the beginning of a concurrent session for the given user. Trying to solve this problem using backtracking is a lot of effort and brushes up against the halting problem. In this method, we simply look backwards at logins and logouts from the event being inspected until we can determine if there is an overlapping session. The problem here is that there is no promise that such an algorithm will complete in reasonable time. This is not a solution.

After a bit more thought, I realized that we're trying to find out something about the cross product between logins and logouts. I was able to formulate this nice SQL query which returns sessions active for @USER at the time @TS

SELECT li.sessionId,
       li.ts as loginTime,
       lo.ts as logoutTime,
       li.username as user
FROM LoginEvent as li
LEFT OUTER JOIN LogoutEvent as lo
    ON li.sessionId = lo.sessionId
WHERE  li.ts <= @TS AND
       (lo.ts >= @TS OR lo.ts IS NULL) AND
       li.username = @USER;