I'm using Lahman Baseball Database, and I want to sort out the batting leader (Max average = hits/at bats) for each year (yearID) and league (lgID).
The problem is I need a row_number or rank to be able to pull ONLY the leader (top result) for each yearID and lgID.
I have this query so far:
select
Concat(m.namefirst,' ', m.namelast) as Player,
b.yearID,
b.lgID,
b.yearID-m.birthyear as Age,
left(round((b.h*1.000/b.ab),3),5) as Average
from
batting b
inner join [master] m on b.playerID=m.playerID
inner join BR_WAR_2013 br on br.playerID=b.playerID and b.yearID=br.yearID
inner join ops_plus o on b.lgID=o.lgID and b.yearID=o.yearID
left outer join AwardsPlayersCollate a
on b.playerID=a.playerID and b.yearID=a.yearID
where
(b.ab + b.bb) > 500
group by
b.yearID,b.yearID-m.birthyear,
b.yearID,
b.lgID,
left(round((b.h*1.000/b.ab),3),5),
Concat(m.namefirst,' ', m.namelast)
order by b.yearID desc,left(round(Max(b.h*1.000/b.ab),3),5) desc
Which Returns this:
Player yearID lgID Age Average
Miguel Cabrera 2013 AL 30 0.348
Michael Cuddyer 2013 NL 34 0.331
Joe Mauer 2013 AL 30 0.324
Mike Trout 2013 AL 22 0.323
Chris Johnson 2013 NL 29 0.321
Which is basically returning ALL of 2013 batting averages that meet the WHERE statement.
However, I want it to name top 1 (the leader) for each lgID and yearID then go to 2012 (yearID) and so forth...
I want this:
Player yearID lgID Age Average
Miguel Cabrera 2013 AL 30 0.348
Michael Cuddyer 2013 NL 34 0.331
Buster Posey 2012 NL 25 0.336
Miguel Cabrera 2012 AL 29 0.330
Miguel Cabrera 2011 AL 28 0.344
Jose Reyes 2011 NL 28 0.337
...
..
.
Though I would do a sort (lgID) to keep AL then NL per yearID in order.
Per next comment: Yes, I've tried Row_Number () and Rank(), which didn't work for me, HOWEVER, I could be syntactically incorrect. I tried many combinations of this:
-- Trying Rank () and Row_Number() to sort out Batting Leaders
SELECT
Concat(m.namefirst,' ', m.namelast) as Player,
b.yearID,
b.lgID,
b.yearID-m.birthyear as Age,
left(round((b.h*1.000/b.ab),3),5) as Average,
Rank() OVER (PARTITION BY b.lgID,b.yearID ORDER BY left(round((b.h*1.000/b.ab),3),5) DESC) AS Row
FROM
batting b
inner join [master] m on b.playerID=m.playerID
inner join BR_WAR_2013 br on br.playerID=b.playerID and b.yearID=br.yearID
inner join ops_plus o on b.lgID=o.lgID and b.yearID=o.yearID
left outer join AwardsPlayersCollate a
on b.playerID=a.playerID and b.yearID=a.yearID
WHERE (b.ab + b.bb) > 500
ORDER BY b.yearID desc, left(round((b.h*1.000/b.ab),3),5) desc, b.lgID
Getting This:
Player yearID lgID Age Average Row
Miguel Cabrera 2013 AL 30 0.348 1
Michael Cuddyer 2013 NL 34 0.331 1
Joe Mauer 2013 AL 30 0.324 2
Mike Trout 2013 AL 22 0.323 3
Chris Johnson 2013 NL 29 0.321 2
Yadier Molina 2013 NL 31 0.319 3
Freddie Freeman 2013 NL 24 0.319 3
But wanting This:
Player yearID lgID Age Average
Miguel Cabrera 2013 AL 30 0.348
Michael Cuddyer 2013 NL 34 0.331
Buster Posey 2012 NL 25 0.336
Miguel Cabrera 2012 AL 29 0.330
Miguel Cabrera 2011 AL 28 0.344
Jose Reyes 2011 NL 28 0.337
...
..
.