0

MySQLDBで連勝を計算しようとしています。勝ち負けのデータを保存するために、次のテーブルを作成しました。

"year"  "team_id"   "week"  "result"
"2007"  "1"         "1"     "W"
"2007"  "1"         "2"     "L"
"2007"  "1"         "3"     "W"
"2007"  "1"         "4"     "W"
"2007"  "1"         "5"     "W"
"2007"  "1"         "6"     "W"
"2007"  "1"         "7"     "W"
"2007"  "1"         "8"     "W"
"2007"  "1"         "9"     "W"
"2007"  "1"         "10"    "L"
. . .

このデータは、12チームにわたって4年間、年間13〜16週間にわたっています。

連勝を計算するには、次のクエリを使用します。

SELECT
    team_id,
    result,
    year,
    MIN(week) as StartDate, 
    MAX(week) as EndDate, 
    COUNT(*) as Games
FROM (
    SELECT
        year,
        week,
        team_id,
        result,
        (   SELECT
                COUNT(*) 
            FROM
                win_loss_temp wl2 
            WHERE
                wl1.team_id = wl2.team_id
                and wl2.result <> wl1.result
                and wl2.year <= wl1.year
                AND wl2.week <= wl1.week) as rungroup
    FROM
        win_loss_temp wl1) A
WHERE result = 'W'
GROUP BY year, team_id, result, rungroup
ORDER BY Games desc
LIMIT 15;

これにより、次の結果が得られます。

team_id    result    year    StartDate    EndDate    Games
----------------------------------------------------------
5          W         2007    1            12         12
1          W         2007    3            9          7
5          W         2008    2            7          6
. . .

これは正しい/期待される出力です...1年以内に。

私の問題は何年にもわたっています。チームが2007年を3ゲーム連勝で終了し、2008年の最初の4ゲームに勝ったとします。これは合計7ゲーム連勝として記録する必要があります(損失を記録せずに7勝)。しかし、これまでのところ、何年にもわたって対応するために上記のクエリを変更する方法を理解することはできません。

年を週と連結した新しいフィールドをテーブルに作成しようとしましたが(たとえば2007.13、2007年の第13週)、年と週を別々に使用する代わりにそのフィールドを使用しても成功しませんでした。ファンキーな結果を出しました。

ありがとうございました。

4

2 に答える 2

0
SELECT
    team_id,
    result,
    year,
    MIN(CONCAT(year,week)) as StartDate, 
    MAX(CONCAT(year,week)) as EndDate, 
    COUNT(*) as Games
于 2012-05-31T19:38:15.840 に答える
0

これを再検討して、以前は不完全だった(今まで私には知られていない)答えを修正します。私の質問に完全に対処するこの外部リソースのおかげで、特定のニーズに完全に合うようにクエリを微調整することができました。

run_groupsまず、次のように定義されたビューを作成しました。

select
    `GR`.`team_id` AS `team_id`,
    ((`GR`.`year` * 100) + `GR`.`week`) AS `GameDate`,
    `GR`.`result` AS `Result`, (
        select
            count(0)
        from
            `jaddl`.`game_results` `G`
        where
            ((`G`.`result` <> `GR`.`result`) and
            (`G`.`team_id` = `GR`.`team_id`) and
            (`G`.`playoffs` = `GR`.`playoffs`) and
            (((`G`.`year` * 100) + `G`.`week`) <= ((`GR`.`year` * 100) + `GR`.`week`)))) AS `RunGroup`
from
    `jaddl`.`game_results` `GR`
where
    (`GR`.`playoffs` = 0)

次に、そのビューを利用して別のビューを作成できます。これにより、データマイニングの目的でクエリできる最終結果が得られます...エンドゲーム。

select
    `run_groups`.`team_id` AS `team_id`,
    `run_groups`.`Result` AS `Result`,
    min(`run_groups`.`GameDate`) AS `StartDate`,
    max(`run_groups`.`GameDate`) AS `EndDate`,
    count(0) AS `Games`
from
    `jaddl`.`run_groups`
group by `run_groups`.`team_id`, `run_groups`.`Result`, `run_groups`.`RunGroup`
order by count(0) desc, `run_groups`.`Result` desc, min(`run_groups`.`GameDate`)

これにより、次のようなデータが出力されます。

team_id  Result  StartDate  EndDate  Games  
      1      -1     201507   201606     13  
      7      -1     201603   201702     13  
      5       1     200701   200712     12  
      1      -1     201202   201213     12  
      2       1     200908   201005     11  
     12       1     201209   201305     10  
      5       1     201401   201410     10  
      4      -1     200813   200908      9  
     11      -1     201112   201207      9  

(Aresult1勝ち、-1負けです。)そして出来上がり!ストリーク関連のすべての統計を照会する必要があるデータセット。year*100+week先行ゼロを文字列として数年と数週間を連結する代わりに使用するという彼の優れた提案について、@eggyalに叫んでください。

于 2012-05-31T19:44:10.093 に答える