如何用Pandas或SQL查询获得最长连续连胜的选手?
连续获胜场次最多选手SQL实现方案
可行性结论
该需求完全可以通过SQL实现,属于SQL经典的「岛屿和间隙」序列问题范畴,仅需内置窗口函数即可完成计算,无需自定义UDF函数。
实现思路
- 前置前提:
matches表的match_num字段按比赛发生时间先后顺序递增排序,数值越大代表比赛越晚。 - 核心逻辑:同一名选手的连续胜场对应的
match_num是连续递增的,选手每赢一场,match_num加1,他的胜场行号rn也加1,二者的差值保持不变,因此相同差值的胜场属于同一段连续胜场,统计每个差值分组的大小即可得到对应连续胜场的长度。
具体SQL实现代码
WITH player_wins AS ( -- 步骤1:提取所有选手的胜场记录,给每个选手的胜场按比赛顺序打行号 SELECT winner_id AS player_id, match_num, ROW_NUMBER() OVER (PARTITION BY winner_id ORDER BY match_num ASC) AS rn FROM matches ), win_streak_groups AS ( -- 步骤2:计算连续胜场分组标识,同一段连续胜场的分组标识相同 SELECT player_id, match_num - rn AS streak_group_id, COUNT(*) AS streak_length FROM player_wins GROUP BY player_id, match_num - rn ), max_streak AS ( -- 步骤3:取所有选手的最长连续胜场,按长度倒序 SELECT player_id, MAX(streak_length) AS max_win_streak FROM win_streak_groups GROUP BY player_id ORDER BY max_win_streak DESC -- 如需保留并列最长的所有选手,删除下方LIMIT 1即可 LIMIT 1 ) -- 步骤4:关联选手表获取选手姓名、国籍等完整信息 SELECT p.*, ms.max_win_streak FROM max_streak ms LEFT JOIN players p ON ms.player_id = p.playerid;
Pandas对应实现思路(可选)
如果你更习惯用Pandas处理,逻辑和SQL完全一致,核心代码如下:
import pandas as pd # 假设df1为matches表、df2为players表 # 1. 给每个选手的胜场按比赛顺序生成行号 df1['rn'] = df1.groupby('winner_id')['match_num'].rank(method='first').astype(int) # 2. 生成连续胜场分组标识 df1['streak_group'] = df1['match_num'] - df1['rn'] # 3. 统计每个分组的连续胜场长度 streak_df = df1.groupby(['winner_id', 'streak_group']).size().reset_index(name='streak_len') # 4. 取每个选手的最长胜场,按长度倒序取最大值 max_streak = streak_df.groupby('winner_id')['streak_len'].max().sort_values(ascending=False).head(1).reset_index() # 5. 关联选手信息得到最终结果 result = pd.merge(max_streak, df2, left_on='winner_id', right_on='playerid', how='left')
内容的提问来源于stack exchange,提问作者jebaseelan ravi
相关产品推荐
相关产品推荐

