全て、
私はこのようなテーブルを持っています:
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は投手のパフォーマンスの尺度)がリストされています。
私のクエリから取得したいのはこれです:その投手のWHIPは過去30日間でどのくらい変化しましたか?
または、より正確には、その投手のWHIPは、少なくとも30日前の彼の最新のスタートからどのくらい変化しましたか?
たとえば、E。ジャクソンの7/4/12のWHIPが1.129で、6/3/12のWHIPが1.500の場合、彼のWHIPが-0.371変化したことを知りたいと思います。
これはどの個人にとっても簡単に理解できますが、すべての日付のすべての投手について計算したいと思います。
これをトリッキーにすることの1つは、すべての日付のデータがないことです。たとえば、E。ジャクソンが7/4/12に売り込んだ場合、少なくとも30日前の最新の開始は5/28/2012である可能性があります。
ただし、同じく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時間)。これは、クエリを修正するための絶対的な最悪の方法の典型的なケースであると確信しています。
[更新]いくつかの説明...
クエリは、各開始の各ピッチャーの値を生成する必要があります。
言い換えれば、E。ジャクソンが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を探しています。
よろしくお願いします!