Chúng tôi sẽ bắt đầu bằng cách làm sạch truy vấn. Bạn nên luôn cố gắng thực hiện các phép tính của mình trên mỗi hàng khi có thể thay vì thực hiện nhiều truy vấn con theo chiều dọc, vì điều này tránh việc DBMS thực hiện nhiều lần chuyển trên cùng một bảng.
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;
Giả sử tôi không bỏ dấu phẩy ở đâu đó, điều này sẽ trả về một cột woba
cho mỗi năm đối với người ném bóng bắt đầu được chỉ định.
Lưu ý rằng tôi đã tham gia các bảng trên e.year_id
thay vì SUBSTRING(e.game_ID,4,4)
; điều này tránh được chi phí gọi SUBSTRING()
trên mỗi bản ghi. Điều này có vẻ nhỏ, nhưng nó có thể cộng lại nhanh chóng trên một bảng lớn.
Như vậy là đủ để bạn bắt đầu.