Skip to main content

LeetCode 1972. First and Last Call On the Same Day SQL Solution

Problem​

LeetCode SQL Problem

  1. First and Last Call On the Same Day

Calls table

caller_idrecipient_idcall_time
842021-08-24 17:46:07
482021-08-24 19:57:13
512021-08-11 05:28:44
832021-08-17 04:04:15
1132021-08-17 13:07:00
8112021-08-17 22:22:22

Solution​

MySQL Solution to report user IDs whose first and last calls on any day were with the same person
WITH ranked_calls
AS (
SELECT *
-- Extract date component
,DATE (call_time) AS call_date
-- Sum up values of caller_id and recipient_id
-- The same people involved in the first and last call when id_sum is equal
,caller_id + recipient_id AS id_sum
-- Within each date, rank call_time ascending order.
-- First call for each day will have rank 1
,RANK() OVER (
PARTITION BY DATE (call_time) ORDER BY call_time
) AS first_call_rank
-- Within each date, rank call_time in descending order
-- Last call for each day will have rank 1
,RANK() OVER (
PARTITION BY DATE (call_time) ORDER BY call_time DESC
) AS last_call_rank
FROM Calls
)
,same_first_and_last_call
AS (
SELECT L.caller_id
,L.recipient_id
-- Perform Self Join to put first and last call of each date in the same row
FROM ranked_calls AS F
INNER JOIN ranked_calls AS L ON F.first_call_rank = 1
AND L.last_call_rank = 1
AND F.call_date = L.call_date
-- Only include rows that have same people involved in the first and last call
AND F.id_sum = L.id_sum
)
-- Get caller_id values and alias the column as user_id
SELECT caller_id AS user_id
FROM same_first_and_last_call

UNION

-- Append recipient_id values
SELECT recipient_id
FROM same_first_and_last_call
ORDER BY user_id

Query Output

user_id
1
4
5
8