{x}
blog image

Get the Second Most Recent Activity

Solution Explanation for LeetCode 1369: Get the Second Most Recent Activity

This problem requires retrieving the second most recent activity for each user in the UserActivity table. If a user has only one activity, that activity should be returned.

Approach

The solution utilizes window functions in SQL to efficiently achieve this. The core idea is to:

  1. Rank Activities: Assign a rank to each activity for each user based on the startDate in descending order. The most recent activity gets rank 1, the second most recent gets rank 2, and so on. This is done using the RANK() window function.

  2. Count Activities per User: Determine the total number of activities for each user using the COUNT() window function. This is crucial for handling users with only one activity.

  3. Filter Results: Select only those rows where the rank is 2 (second most recent) or the total activity count for the user is 1 (only one activity).

SQL Code (MySQL)

SELECT
    username,
    activity,
    startdate,
    enddate
FROM
    (
        SELECT
            *,
            RANK() OVER (
                PARTITION BY username
                ORDER BY startdate DESC
            ) AS rk,
            COUNT(username) OVER (PARTITION BY username) AS cnt
        FROM UserActivity
    ) AS a
WHERE a.rk = 2 OR a.cnt = 1;

Time Complexity Analysis

The time complexity is dominated by the window functions (RANK() and COUNT()). Window functions typically have a time complexity of O(N log N) in the worst case, where N is the number of rows in the UserActivity table. This is because sorting is often involved in calculating ranks. However, efficient database implementations might optimize this in practice. The final filtering step (WHERE clause) has a linear time complexity, O(N). Therefore, the overall time complexity can be considered O(N log N) in the worst case.

Space Complexity Analysis

The space complexity depends on the size of the intermediate result set generated by the inner query. In the worst case, this intermediate result set could be as large as the input table itself. Therefore, the space complexity is O(N) in the worst case. The final result set, however, will be significantly smaller, containing only one row per user.

Note: The actual performance might vary based on database optimization techniques and the size of the input data. For extremely large datasets, further optimization might be needed, potentially involving indexing or materialized views. There might also be subtle differences in performance between different SQL database systems.