所以我搜索并发现了很多与我类似的问题,例如
MYSQL - get a row for each year, with total sum for each month但是我正在寻找另一种方式。我正在使用Lahman数据库,并按每年WAR排名前十名。然后,我对那些球员的年龄进行平均,以得出该赛季的平均年龄。我每年都尝试这样做,但是我仍然坚持这样做。
SELECT AVG(t.age) As AverageAge, w.yearID
FROM (SELECT w.playerID, w.age
From war_batting w, Master m
WHERE w.playerID = m.playerID AND w.yearID = 2012
ORDER by w.WAR desc
LIMIT 10) t,
war_batting w;
这显示了该赛季前10名球员的平均值,因此我希望每个赛季都能做到。在我链接到的文章中,我看到他们为他们需要的每一个价值而努力,但是我正在寻找一种方法,在近150年内不涉及重复相同的代码。我以前已经用Java和C ++编程过,所以自然地我在寻找一种方法来遍历我所拥有的东西,并一直增加到年份ID直到当前年份。我正在努力了解如何做到这一点。上面的代码还返回yearID为2004,而不是2012,但是我对修复它的能力更有信心,因为我很确定自己在其他测试中也有。另外,如果我第一次发布此代码块时效果不佳,我将尝试修复它,因为这是我的第一篇文章。
最佳答案
您无需从master
表中选择任何内容,因此无需将其加入。
请尝试以下查询。它具有一个内部查询,该查询使用用户定义的变量基于WAR降序进行排名。然后,外部查询仅查看
SELECT AVG(T.age) AS AverageAge, T.yearID
FROM
(SELECT w.playerID, w.age, w.yearID,
CASE WHEN @prev_year = yearID THEN @rank := @rank+1
ELSE @rank:=1
END as rank,
@prev_year := yearID
FROM war_batting w
ORDER BY yearID ASC, WAR DESC
)T
WHERE T.rank <= 10
GROUP BY T.yearID
sqlfiddle
这样,您只需在查询末尾添加
ORDER BY T.yearID DESC
或ORDER BY T.yearID ASC
即可获得所有结果,而无需在150年中每年执行相同的代码。关于mysql - 获取显示每年MYSQL平均值的行的列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36816075/