Leetcode 3390. Longest Team Pass Streak

1.题目基本信息

1.1.题目描述

Table: Teams

±------------±--------+

| Column Name | Type |

±------------±--------+

| player_id | int |

| team_name | varchar |

±------------±--------+

player_id is the unique key for this table.

Each row contains the unique identifier for player and the name of one of the teams participating in that match.

Table: Passes

±------------±--------+

| Column Name | Type |

±------------±--------+

| pass_from | int |

| time_stamp | varchar |

| pass_to | int |

±------------±--------+

(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 and pass_to players belong to the same team

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.

1.2.题目地址

https://leetcode.cn/problems/longest-team-pass-streak/description/

2.解题方法

2.1.解题思路

窗口函数+分组聚合

2.2.解题步骤

第一步,将team_name绑定到passes表格中,记字段flag为传球的状态(成功传球为0,失败为1),得到表格T1

第二步,使用窗口函数SUM,按team1分组、time_stamp进行升序排列,计算flag字段的前缀和,即为flag_prefix字段,得到表格T2

第三步,按team1,flag_prefix进行聚合,如果flag_prefix=0,COUNT()即为连续成功次数,否则COUNT()-1即为连续成功次数,记为字段streak,得到表格T3

第四步,按team_name进行分组聚合,统计streak的最大值记为longest_streak字段,即为题解

3.解题代码

sql代码

sql 复制代码
# Write your MySQL query statement below

WITH T1 AS (
    # 第一步,将team_name绑定到passes表格中,记字段flag为传球的状态(成功传球为0,失败为1),得到表格T1
    SELECT 
        pass_from, time_stamp, pass_to, 
        t1.team_name AS team1, 
        IF(t1.team_name = t2.team_name, 0, 1) AS flag
    FROM Passes 
        LEFT JOIN Teams AS t1 ON Passes.pass_from = t1.player_id
        LEFT JOIN Teams AS t2 ON Passes.pass_to = t2.player_id
), T2 AS (
    # 第二步,使用窗口函数SUM,按team1分组、time_stamp进行升序排列,计算flag字段的前缀和,即为flag_prefix字段,得到表格T2
    SELECT 
        team1, 
        SUM(flag) OVER (PARTITION BY team1 ORDER BY time_stamp) AS flag_prefix
    FROM T1
), T3 AS (
    # 第三步,按team1,flag_prefix进行聚合,如果flag_prefix=0,COUNT(*)即为连续成功次数,否则COUNT(*)-1即为连续成功次数,记为字段streak,得到表格T3
    SELECT 
        team1, 
        IF(flag_prefix = 0, COUNT(flag_prefix), COUNT(flag_prefix) - 1) AS streak
    FROM T2
    GROUP BY team1, flag_prefix
)
# 第四步,按team_name进行分组聚合,统计streak的最大值记为longest_streak字段,即为题解
SELECT 
    team1 AS team_name, 
    MAX(streak) AS longest_streak
FROM T3
GROUP BY team1
HAVING MAX(streak) != 0
ORDER BY team1

4.执行结果

相关推荐
要开心吖ZSH8 小时前
MySQL 慢 SQL 排查操作手册-个人笔记版
java·笔记·sql·mysql·慢查询
oradh10 小时前
Oracle固定执行计划的方法---SQL Plan Baseline
数据库·sql·oracle
jnrjian13 小时前
PG dblink 可以借用fdw 名字和密码直接访问
sql
2601_9603563815 小时前
2027零售商品计划岗能力拆解:统计学、SQL、Excel与业务指标怎么结合
sql·excel·零售
好奇的菜鸟16 小时前
GORM 入门(二):从 database/sql 平滑过渡到 GORM
数据库·sql
这个DBA有点耶16 小时前
关系数据库管理系统选型指南:四步决策框架与主流产品技术路线对比
数据库·sql·程序人生·mysql·database·dba
jason.zeng@150220716 小时前
(七)「固化 Rest 接口 + Text-to-SQL 灵活查询」双模式 Agent 架构教程
数据库·python·sql·ai·架构·langchain·ai编程
2501_9336707917 小时前
2027届数据类专业投用户增长岗:A/B实验、指标和SQL准备思路
数据库·sql
天空鸟_时光不老20 小时前
10-Agent安全隐患与SQL执行层加固
java·数据库·人工智能·sql·spring·maven·mybatis
2501_933670792 天前
2027届数学与应用数学转经营分析:SQL、财务指标与业务指标补齐路线
数据库·sql·数学建模