SQL

Sessionization — Group Events into Sessions

admin by @admin ADMIN
1m ago
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
Stitch a stream of events into "sessions" where events more than N minutes apart start a new session. Uses LAG + a SUM-OVER trick to assign session IDs.
SQL
Raw
-- Each event gets a session_id where consecutive events are <= 30 min apart
WITH gaps AS (
    SELECT user_id, event_at,
           CASE
             WHEN EXTRACT(EPOCH FROM event_at -
                  LAG(event_at) OVER (PARTITION BY user_id ORDER BY event_at)) > 1800
             THEN 1
             ELSE 0
           END AS new_session
    FROM   events
)
SELECT user_id, event_at,
       SUM(new_session) OVER (PARTITION BY user_id ORDER BY event_at) AS session_id
FROM   gaps;

-- Per-session aggregates from the above
WITH sessions AS (   -- ... same as above
    SELECT user_id, event_at,
           SUM(new_session) OVER (PARTITION BY user_id ORDER BY event_at) AS sid
    FROM   gaps
)
SELECT user_id, sid AS session_id,
       MIN(event_at) AS started_at,
       MAX(event_at) AS ended_at,
       COUNT(*)       AS event_count
FROM   sessions
GROUP  BY user_id, sid;
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.