所有人,
我有一张这样的桌子:

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赛季每场比赛的首发投手,以及该投手当前的鞭子(鞭子是衡量投手表现的指标)。
我想从我的问题中得到的是:在过去的30天里,那个投手的鞭子换了多少?
或者,更准确地说,自从这位投手最近一次首发至少30天前以来,他的鞭子变化了多少?
例如,如果E.Jackson在7/4/12的鞭子是1.129,6/3/12的鞭子是1.500,那么我想知道他的鞭子变化了-0.371。
这对任何人来说都很容易理解,但我想计算所有投手,所有日期的投手。
让这件事变得棘手的一件事是,并不是每个日期都有数据。例如,如果E.Jackson在2012年7月4日投球,那么至少30天前的最新开球时间可能是2012年5月28日。
然而,对K.科雷亚来说,他也在2012年7月4日投球,他最近的首发至少是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))

这看起来很有用(希望能说明我要捕获的内容),但是需要非常长的时间——我的表可以追溯到几个季节,大约有6250行——这个查询花费了7289秒(是的,这是正确的——超过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天的跟踪鞭子为每个开始。
多谢提前!

最佳答案

我认为你不需要自我加入。。您可以使用这样的子查询:

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(有些条目没有上个月的条目来计算差异,因此为空)

关于mysql - SQL:计算n天内的值变化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11546935/

10-14 13:59
查看更多