所以我搜索并发现了很多与我类似的问题,例如
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 DESCORDER BY T.yearID ASC即可获得所有结果,而无需在150年中每年执行相同的代码。

关于mysql - 获取显示每年MYSQL平均值的行的列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36816075/

10-11 06:49