2

全て、

私はこのようなテーブルを持っています:

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を探しています。

よろしくお願いします!

4

1 に答える 1

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(一部のエントリには、差を計算するための前月のエントリがないため、nullになります)

于 2012-07-18T17:45:14.650 に答える