Začneme vyčištěním dotazu. Vždy byste se měli snažit provádět výpočty napříč každým řádkem, je-li to možné, spíše než provádět více vertikálních dílčích dotazů, protože to zabrání tomu, aby DBMS prováděl více průchodů přes stejnou tabulku.
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;
Za předpokladu, že jsem někde neupustil čárku, vrátí to sloupec woba
za každý rok pro konkrétního počátečního nadhazovače.
Všimněte si, že jsem připojil tabulky na e.year_id
místo SUBSTRING(e.game_ID,4,4)
; tím se vyhnete režii volání SUBSTRING()
na každém záznamu. Něco takového se zdá být zanedbatelné, ale u velkého stolu se to může rychle sčítat.
To by vám mělo stačit, abyste mohli začít.