#3060
Hard Database User activities within time bounds
Database
41.3% acceptance
Mar 31, 2026
5
20
No description available.
Solution
Pandas
Time O(n)
Space O(1)
# Table: Sessions
#
# +---------------+----------+
# | Column Name | Type |
# +---------------+----------+
# | user_id | int |
# | session_start | datetime |
# | session_end | datetime |
# | session_id | int |
# | session_type | enum |
# +---------------+----------+
# session_id is column of unique values for this table.
# session_type is an ENUM (category) type of (Viewer, Streamer).
# This table contains user id, session start, session end, session id and session type.
#
# Write a solution to find the the users who have had at least two session of the same type (either 'Viewer' or 'Streamer') with a maximum gap of 12 hours between sessions.
#
# Return the result table ordered by user_id in ascending order.
#
# The result format is in the following example.
#
# Example 1:
# Input:
# Sessions table:
# +---------+---------------------+---------------------+------------+--------------+
# | user_id | session_start | session_end | session_id | session_type |
# +---------+---------------------+---------------------+------------+--------------+
# | 101 | 2023-11-01 08:00:00 | 2023-11-01 09:00:00 | 1 | Viewer |
# | 101 | 2023-11-01 10:00:00 | 2023-11-01 11:00:00 | 2 | Streamer |
# | 102 | 2023-11-01 13:00:00 | 2023-11-01 14:00:00 | 3 | Viewer |
# | 102 | 2023-11-01 15:00:00 | 2023-11-01 16:00:00 | 4 | Viewer |
# | 101 | 2023-11-02 09:00:00 | 2023-11-02 10:00:00 | 5 | Viewer |
# | 102 | 2023-11-02 12:00:00 | 2023-11-02 13:00:00 | 6 | Streamer |
# | 101 | 2023-11-02 13:00:00 | 2023-11-02 14:00:00 | 7 | Streamer |
# | 102 | 2023-11-02 16:00:00 | 2023-11-02 17:00:00 | 8 | Viewer |
# | 103 | 2023-11-01 08:00:00 | 2023-11-01 09:00:00 | 9 | Viewer |
# | 103 | 2023-11-02 20:00:00 | 2023-11-02 23:00:00 | 10 | Viewer |
# | 103 | 2023-11-03 09:00:00 | 2023-11-03 10:00:00 | 11 | Viewer |
# +---------+---------------------+---------------------+------------+--------------+
# Output:
# +---------+
# | user_id |
# +---------+
# | 102 |
# | 103 |
# +---------+
# Explanation:
# - User ID 101 will not be included in the final output as they do not have any two sessions of the same session type.
# - User ID 102 will be included in the final output as they had two viewer sessions with session IDs 3 and 4, respectively, and the time gap between them was less than 12 hours.
# - User ID 103 participated in two viewer sessions with a gap of less than 12 hours between them, identified by session IDs 10 and 11. Therefore, user 103 will be included in the final output.
# Output table is ordered by user_id in increasing order.
import pandas as pd
def user_activities(sessions: pd.DataFrame) -> pd.DataFrame:
sessions = sessions.sort_values(['user_id', 'session_type', 'session_start'])
sessions['prev_end'] = sessions.groupby(['user_id', 'session_type'])['session_end'].shift(1)
sessions['gap_hours'] = (sessions['session_start'] - sessions['prev_end']).dt.total_seconds() / 3600
result = sessions[sessions['gap_hours'].notna() & (sessions['gap_hours'] <= 12)]['user_id'].unique()
return pd.DataFrame({'user_id': sorted(result)})