Ще започнем с почистване на заявката. Винаги трябва да се опитвате да извършвате изчисленията си във всеки ред, когато е възможно, вместо да извършвате множество вертикални подзаявки, тъй като това избягва СУБД да извършва множество преминавания през една и съща таблица.
SELECT
(
( (g.wbb * SUM(IF(e.event_cd = 14, 1, 0)))
+ (g.whbp * SUM(IF(e.event_cd = 16, 1, 0)))
+ (g.w1b * SUM(IF(e.event_cd = 20, 1, 0)))
+ (g.w2b * SUM(IF(e.event_cd = 21, 1, 0)))
+ (g.w3b * SUM(IF(e.event_cd = 22, 1, 0)))
+ (g.whr * SUM(IF(e.event_cd = 23, 1, 0)))
)
/
(
SUM(IF(e.ab_fl = 'T', 1, 0))
+ SUM(IF(e.event_cd = 14, 1, 0))
+ SUM(IF(e.sf_fl = 'T', 1, 0))
+ SUM(IF(e.event_cd = 16, 1, 0))
)
) AS woba
FROM events e, guts g
WHERE e.year_id = g.season_id
AND e.pit_start_fl = 'T'
AND e.pit_id = starting_pitcher
GROUP BY g.season;
Ако приемем, че не съм пуснал запетая някъде, това ще върне колона woba
за всяка година за посочения начален стомна.
Имайте предвид, че се присъединих към таблиците на e.year_id
вместо SUBSTRING(e.game_ID,4,4)
; това избягва излишните разходи за извикване на SUBSTRING()
на всеки запис. Този тип неща изглеждат незначителни, но могат да се добавят бързо върху голяма маса.
Това трябва да е достатъчно, за да започнете.