所有
我有一个看起来像这样的表:
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。
非常感谢提前!
答案 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(有些条目没有上个月的条目来计算差异,所以它是空的)