Welcome to Subscribe On Youtube
3390. Longest Team Pass Streak 🔒
Description
Table: Teams
+-++ \| player_id \| int \| \| team_name \| varchar \| +-++ \| Column Name \| Type \| +-++ (pass_from, time_stamp) is the unique key for this table. pass_from is a foreign key to player_id from Teams table. Each row represents a pass made during a match, time_stamp represents the time in minutes (00:00-90:00) when the pass was made, pass_to is the player_id of the player receiving the pass.
Write a solution to find the longest successful pass streak for each team during the match. The rules are as follows:
- A successful pass streak is defined as consecutive passes where:
- Both the
pass_from
andpass_to
players belong to the same team
- Both the
- A streak breaks when either:
- The pass is intercepted (received by a player from the opposing team)
Return the result table ordered by team_name
in ascending order.
The result format is in the following example.
Example:
Input:
Teams table:
+--+ \| player_id \| team_name \| +--+ \| 1 \| Arsenal \| \| 2 \| Arsenal \| \| 3 \| Arsenal \| \| 4 \| Arsenal \| \| 5 \| Chelsea \| \| 6 \| Chelsea \| \| 7 \| Chelsea \| \| 8 \| Chelsea \| +--+
Passes table:
++ \| pass_from \| time_stamp \| pass_to \| ++ \| 1 \| 00:05 \| 2 \| \| 2 \| 00:07 \| 3 \| \| 3 \| 00:08 \| 4 \| \| 4 \| 00:10 \| 5 \| \| 6 \| 00:15 \| 7 \| \| 7 \| 00:17 \| 8 \| \| 8 \| 00:20 \| 6 \| \| 6 \| 00:22 \| 5 \| \| 1 \| 00:25 \| 2 \| \| 2 \| 00:27 \| 3 \| ++
Output:
+-+ \| team_name \| longest_streak \| +-+ \| Arsenal \| 3 \| \| Chelsea \| 4 \| +-+
Explanation:
- Arsenal's streaks:
- First streak: 3 passes (1→2→3→4) ended when player 4 passed to Chelsea's player 5
- Second streak: 2 passes (1→2→3)
- Longest streak = 3
- Chelsea's streaks:
- First streak: 3 passes (6→7→8→6→5)
- Longest streak = 4
Solutions
Solution 1
-
WITH PassesWithTeams AS ( SELECT p.pass_from, p.pass_to, t1.team_name AS team_from, t2.team_name AS team_to, IF(t1.team_name = t2.team_name, 1, 0) same_team_flag, p.time_stamp FROM Passes p JOIN Teams t1 ON p.pass_from = t1.player_id JOIN Teams t2 ON p.pass_to = t2.player_id ), StreakGroups AS ( SELECT team_from AS team_name, time_stamp, same_team_flag, SUM( CASE WHEN same_team_flag = 0 THEN 1 ELSE 0 END ) OVER ( PARTITION BY team_from ORDER BY time_stamp ) AS group_id FROM PassesWithTeams ), StreakLengths AS ( SELECT team_name, group_id, COUNT(*) AS streak_length FROM StreakGroups WHERE same_team_flag = 1 GROUP BY 1, 2 ), LongestStreaks AS ( SELECT team_name, MAX(streak_length) AS longest_streak FROM StreakLengths GROUP BY 1 ) SELECT team_name, longest_streak FROM LongestStreaks ORDER BY 1;