2011-12-11 131 views
3

如果我有一张如下所示的SQL表,我该如何计算当前的连胜数(并根据赛季进行连胜/连败)。我想更新表格并填写每条记录的连胜数。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 
+0

@Ray为了编写好的SQL查询,您还需要在此表中存储季节信息。 – Pradeep

+0

你是指什么季节信息? – Ray

+0

我从来没有做过这样的事情,所以我有一个很好的机会,我忽略了一些东西,但据我所知,你需要提前汇总数据。据我所知,没有有效的方式将数据从该模式中提取出来,因为它需要遍历整个表。 – Corbin

回答

5

对于每个游戏,计数与之前相同的结果的游戏,以便不存在具有相反结果的游戏。将结果保存到一个临时表:

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