SQL技术实现:从最新日期倒推查询球队当前比赛Streak
从最新日期倒推计算当前球队主场战绩 Streak
针对你需要从最新比赛日期倒推计算当前球队主场连续战绩的需求,我来给你具体的实现思路和SQL代码:
核心思路
- 先对每个主队的比赛记录按日期降序排序,让最新的比赛排在最前面;
- 给每条记录标记“是否和上一场(更早的一场)结果相同”,一旦出现不同结果就划分一个新分组;
- 统计每个分组的连续场次,取最新的那个分组的场次,再结合比赛结果生成对应的Streak标识(比如胜场用W+场次,平场用D+场次,负场用L+场次)。
SQL 实现代码
假设你的表名为 matches,可以用窗口函数来实现这个逻辑:
WITH ranked_matches AS ( SELECT HomeTeam, FTR, Date, -- 标记结果变化的分界点:当前结果和上一场(更早的)不同则为1,否则0 SUM(CASE WHEN FTR = LAG(FTR) OVER (PARTITION BY HomeTeam ORDER BY Date DESC) THEN 0 ELSE 1 END) OVER (PARTITION BY HomeTeam ORDER BY Date DESC) AS streak_group FROM matches ), streak_counts AS ( SELECT HomeTeam, FTR, COUNT(*) AS streak_length, -- 取最新的分组(分组值最小的,因为从最新开始计数) ROW_NUMBER() OVER (PARTITION BY HomeTeam ORDER BY streak_group) AS rn FROM ranked_matches GROUP BY HomeTeam, FTR, streak_group ) SELECT HomeTeam, -- 根据FTR生成对应的Streak标识:H=胜(W),A=负(L),D=平(D) CONCAT( CASE FTR WHEN 'H' THEN 'W' WHEN 'A' THEN 'L' WHEN 'D' THEN 'D' END, streak_length ) AS Streak FROM streak_counts WHERE rn = 1;
验证你的示例数据
把你提供的Team A数据代入:
Date | HomeTeam | AwayTeam | FTR
2017-08-14 | Team A | Team B | A
2017-08-24 | Team A | Team C | H
2017-08-28 | Team A | Team D | D
2017-09-11 | Team A | Team B | H
2017-09-25 | Team A | Team D | H
按日期降序排列后,顺序为:2017-09-25(H)、2017-09-11(H)、2017-08-28(D)、2017-08-24(H)、2017-08-14(A)
标记streak_group时:
- 第一条(2017-09-25)没有上一条记录,streak_group=1;
- 第二条(2017-09-11)和上一条结果都是H,streak_group保持1;
- 第三条(2017-08-28)结果为D,和上一条H不同,streak_group=2;
- 后续记录以此类推。
分组统计后,最新的分组(rn=1)是FTR=H、场次2,最终输出Team A | W2,和你的预期结果完全一致。
补充说明
- 如果球队最新一场是平局,会输出
D1;连平3场则输出D3; - 主队输球(FTR=A)的情况会输出
L+场次,比如连输2场就是L2; - 这个方案支持同时计算多支主队的当前Streak,无需单独筛选某一支球队。
内容的提问来源于stack exchange,提问作者Ned
相关产品推荐
相关产品推荐

