mysql之SQL计算连胜和连败

Leo_wl 阅读:134 2024-11-24 20:56:43 评论:0

如果我有一个如下所示的 SQL 表,我如何计算当前的连胜或连败(以及按赛季对连胜或连败进行分组/重置)。我想更新表格并为每条记录填写条纹。

所以对于#1 的连胜数将是“-1”,#2 将是“1”,#3 将是“2”,但一旦我们下降到#7,它将再次重置为“1”。 (+1 表示“赢了 1 场”,-1 表示“输了 1 场”,等等)

ID    team    date         Result    season     streak 
1     76ers   2000-01-01   Loss      2000       Null 
2     76ers   2000-01-05   Win       2000       Null 
3     76ers   2000-01-08   Win       2000       Null 
4     Lakers  2000-01-03   Loss      2000       Null 
5     Lakers  2000-01-07   Loss      2000       Null 
6     Lakers  2000-01-01   Win       2000       Null 
 
7     76ers   2002-03-01   Win       2001       Null 
8     76ers   2002-03-05   Win       2001       Null 
9     76ers   2002-03-08   Loss      2001       Null 
10    Lakers  2002-03-03   Loss      2001       Null 
11    Lakers  2002-03-07   Loss      2001       Null 
12    Lakers  2002-03-01   Win       2001       Null 

请您参考如下方法:

对于每场比赛,统计前一场比赛结果相同的比赛数,中间没有比赛结果相反的比赛。将结果存储在临时表中:

CREATE TEMPORARY TABLE STREAK_TABLE 
SELECT 
    ID, 
    ( 
        SELECT 1 + COUNT(*)                 -- Earlier games with the same result, team and season. 
        FROM YOUR_TABLE T2 
        WHERE 
            T1.Result = T2.Result 
            AND T1.team = T2.team 
            AND T1.season = T2.season 
            AND T1.date > T2.date 
            AND NOT EXISTS ( 
                SELECT *                    -- The games in between, with the same team and season but opposite result. 
                FROM YOUR_TABLE T3 
                WHERE 
                    T2.Result <> T3.Result 
                    AND T1.team = T3.team 
                    AND T1.season = T3.season 
                    AND T3.date BETWEEN T2.date AND T1.date 
            ) 
    ) S 
FROM YOUR_TABLE T1 

然后,更新原始表(并否定过程中的连败):

UPDATE YOUR_TABLE 
SET streak = ( 
    SELECT CASE Result WHEN 'Win' THEN S ELSE -S END 
    FROM STREAK_TABLE 
    WHERE STREAK_TABLE.ID = YOUR_TABLE.ID 
) 

最后,清理临时表:

DROP TABLE STREAK_TABLE 


标签:mysql
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号