所有值的變化,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。
非常感謝提前!
您正在使用什麼RDBMS? (根據你的mm/dd/yyyy日期格式猜測MS SQL Server) – 2012-07-18 17:28:38
其實,MySQL。日期只是看起來像這樣,因爲我在我自己的類型... – mattstuehler 2012-07-18 17:35:34
你可以創建表,並填寫數據在sqlfiddle?我感受到測試我的查詢的衝動! – Samson 2012-07-18 18:05:14