2012-07-18 68 views
2

所有值的變化,SQL:計算在n天期間

我有一個表,看起來像這樣:

Date  Pitcher  WHIP 
-------- -------------- ----- 
7/4/12 JACKSON, E  1.129 
7/4/12 YOUNG, C  1.400 
7/4/12 CORREIA, K  1.301 
7/4/12 WOLF, R  1.594 
... 
6/28/12 JACKSON, E  1.137 
6/27/12 YOUNG, C  1.750 
... 
6/19/12 JACKSON, E  1.215 
6/17/12 YOUNG, C  1.851 

我已經設置了這裏SQLFiddle:http://sqlfiddle.com/#!2/addfe/1

換句話說,表中列出了MLB賽季每場比賽的首發球員,以及該投手現在的WHIP(WHIP是投手錶現的一項指標)。

我想從我的查詢中得到的是:在過去30天內,投手的WHIP有多少變化?

或者更準確地說,自從他最近一次開始至少30天以前,WHIP有多少變化?例如,如果E. Jackson在12/4/12的WHIP是1.129,而他在6/3/12的WHIP是1.500,那麼我想知道他的WHIP改變了-0.371。

這很容易找出任何個人,但我想計算,所有投手,在所有日期。

使這個棘手的事情之一是沒有每個日期的數據。例如,如果E. Jackson在7/4/12投球,至少30天前的最近一次比賽可能在2012年5月28日。

然而,對於也在7/4/12投出的K. Correia--他最近30天前的最新開始可能是2012年5月26日。

我假設我需要將表加入自己,但我不知道該怎麼做。

這是我的第一個嘗試:

select 
    t1.home_pitcher, 
    t1.date, 
    t1.All_starts_whip, 
    t2.All_starts_whip 
from 
    mlb_data t1 
join 
    mlb_data t2 
ON 
    t1.home_pitcher = t2.home_pitcher 
and 
    t2.date = (select max(date) from mlb_data t3 where t3.home_pitcher = t1.home_pitcher and t3.date < date_sub(t1.date, interval 1 month)) 

這似乎是工作(希望說明什麼,我試圖捕捉),但長期的窘況需要 - 我的表可以追溯到幾個賽季,並擁有約6,250行 - 這個查詢耗時7,289秒(是的,這是正確的 - 超過2小時)。我確定這是糾正查詢絕對最糟糕的一種經典案例。

[更新]一些澄清...

查詢應產生一個值爲每個投手每次啓動。換句話說,如果傑克遜在10場比賽中投中,他將在結果集中列出10次。

Date  Pitcher  WHIP WHIP_30d_ago 
-------- -------------- ----- ------------ 
7/4/12 JACKSON, E  1.129 1.111 
... 
5/18/12 JACKSON, E  1.111 2.222 
... 
4/14/12 JACKSON, E  2.222 3.333 

換句話說,我正在尋找每個開始30天的尾隨WHIP。

非常感謝提前!

+0

您正在使用什麼RDBMS? (根據你的mm/dd/yyyy日期格式猜測MS SQL Server) – 2012-07-18 17:28:38

+0

其實,MySQL。日期只是看起來像這樣,因爲我在我自己的類型... – mattstuehler 2012-07-18 17:35:34

+1

你可以創建表,並填寫數據在sqlfiddle?我感受到測試我的查詢的衝動! – Samson 2012-07-18 18:05:14

回答

2

我不認爲你需要自連接爲..你可以使用一個子查詢是這樣的:

select 
     t1.home_pitcher, 
     t1.date, 
     t1.All_starts_whip, 
     (SELECT t2.all_starts_whip FROM mlb_data t2 
     WHERE 
     t2.date < date_sub(t1.date, interval 1 month) 
     AND t2.home_pitcher=t1.home_pitcher 
     ORDER BY t2.date DESC LIMIT 1) as previous_whip, 
     t1.all_starts_whip - previous_whip 

    FROM 
     mlb_data t1 

所以每個鞭得分爲每個玩家,你以前的一月的最新得分並計算進化。

檢查出來:http://sqlfiddle.com/#!2/addfe/8(某些條目唐噸有前一個月進入計算差值所以它是空)

+0

我測試了這個,它的作品除別名的東西...我刪除了月份更改列和別名,它工作正常。你得到最後一個分數和一個多月前的最後一個分數,所以你只需要計算差異 – Samson 2012-07-18 18:30:35

+0

radashk - 我認爲你的查詢ALMOST做了我一直在尋找的東西,但我認爲我沒有足夠清晰原來的問題。它看起來像你的查詢返回,每個投手,他們當前的WHIP和他們的WHIP一個月前。但是我正在尋找的是每個投手每個開局的價值。例如,如果E. Jackson有16次啓動,那麼查詢應該產生一個結果集,列出他16次 - 每行將有他當前的WHIP,以及他的WHIP從30天前。 – mattstuehler 2012-07-18 19:39:12

+0

當我到達真正的電腦時,我會發布信息 – Samson 2012-07-18 21:00:24