2012-05-31 90 views
0

我試圖計算MySQL數據庫中的連勝數。我創建了下面的表來存儲輸/贏數據:在MySQL中計算連續或連續數字

"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" 
. . . 

該數據跨越4年跨越12支球隊,每年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 
. . . 

這是正確的/預期輸出......一個給定的一年內。

我的問題是跨越多年。說一支球隊在三連勝中取得了2007年的勝利,然後贏得了2008年的前四場比賽。這應該被記錄爲總共7場比賽的勝利(7場勝利沒有記錄到損失)。但到目前爲止,我無法弄清楚如何修改上述查詢以適應跨越年份。

我甚至試過在那年與周(例如2007.13 2007年的13周)級聯表創建一個新的領域,但使用該字段,而不是一年,周分別沒有成功。獲得時髦的結果。

謝謝。

回答

0

重溫此修改我以前不完整的(到目前爲止我不知道)答案。感謝this external resource,這完全解決了我的問題,我能夠調整查詢來完美地滿足我的特定需求。

首先,我創建定義爲這樣一個觀點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) 

然後我就可以利用該視圖創建另一種觀點認爲,這給了我,我就可以查詢的數據挖掘的目的,最終的結果.. .my結束遊戲。

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 

(的1一個result是一個雙贏,-1是虧損的。)瞧!我需要查詢所有與條紋有關的統計數據。向@eggyal大聲說出使用year*100+week的優秀建議,而不是將幾年和幾周的前導零連接起來作爲字符串。

+0

哦。我在看到您發佈此消息之前發表了評論。是的,這幾乎肯定是你的問題。更好的方法是使用一個整數,而不是使用字符串和填充操作:'YEAR * 100 + WEEK'。 – eggyal

+0

@eggyal偉大的思想家都認爲。 :)但看到我在這個答案中的最新編輯...這個問題沒有解決。 – hannebaumsaway

+0

是的,改變你的子選擇也可以選擇concat(year,week)並從你的select和你的group中刪除year。 –

0
SELECT 
    team_id, 
    result, 
    year, 
    MIN(CONCAT(year,week)) as StartDate, 
    MAX(CONCAT(year,week)) as EndDate, 
    COUNT(*) as Games