You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:27:01