LISTING C: Grouping Web Site Hits by Session SELECT a.site_url, a.caller_ip, a.hit_datetime AS start_session, MIN(b.hit_datetime) AS end_session FROM (SELECT DISTINCT site_url, caller_ip, hit_datetime FROM web_hits m WHERE NOT EXISTS (SELECT * FROM web_hits m2 WHERE m2.site_url = m.site_url AND m2.caller_ip = m.caller_ip AND m2.hit_datetime < m.hit_datetime AND DATEADD(MINUTE, 30, m2.hit_datetime)>=m.hit_datetime ) ) a JOIN ( SELECT DISTINCT site_url, caller_ip, hit_datetime FROM web_hits m WHERE NOT EXISTS (SELECT * FROM web_hits m2 WHERE m2.site_url = m.site_url AND m2.caller_ip = m.caller_ip AND DATEADD(MINUTE, 30, m2.hit_datetime) > DATEADD(MINUTE, 30, m.hit_datetime) AND m2.hit_datetime<= DATEADD(MINUTE, 30, m.hit_datetime)) ) b ON b.site_url = a.site_url AND b.caller_ip = a.caller_ip AND DATEADD(MINUTE, 30, b.hit_datetime) >= a.hit_datetime GROUP BY a.site_url, a.caller_ip, a.hit_datetime