SQL Рассчитать выигрышные и проигрышные серии - PullRequest
3 голосов
/ 12 декабря 2011

Если у меня есть таблица 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

1 Ответ

5 голосов
/ 12 декабря 2011

Для каждой игры считайте игры с тем же результатом, который был до него, так что между ними нет игр с противоположным результатом. Сохраните результаты во временной таблице:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...