SQL:计算n天期间值的变化

时间:2012-07-18 17:23:48

标签: mysql sql

所有

我有一个看起来像这样的表:

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天内有多少变化?

或者更确切地说,自从他最近一次至少30天前开始以来,该投手的WHIP有多少变化?

所以,例如,如果E. Jackson在7/4/12的WHIP是1.129,而他的WHIP在6/3/12是1.500,那么我想知道他的WHIP改变了-0.371。 / p>

对于任何个人来说这很容易理解,但我想在所有日期计算所有投手的数据。

使这一点变得棘手的一个原因是每个日期都没有数据。例如,如果E. Jackson在2012年7月4日投球,那么至少30天前的最近一次开始时间可能是2012年5月28日。

然而,对于K. Correia来说,他也是在2012年7月4日投球 - 他最近一次至少30天前的开局可能是5/26/2012。

我假设我需要加入桌子,但我不知道该怎么做。

这是我的第一次尝试:

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。

非常感谢提前!

1 个答案:

答案 0 :(得分: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(有些条目没有上个月的条目来计算差异,所以它是空的)