获取显示每年MYSQL的平均值的行列表

时间:2016-04-23 20:32:38

标签: mysql database

所以我搜索过并发现了许多类似于我的问题 MYSQL - get a row for each year, with total sum for each month但我正在寻找一种不同的方式。我正在使用拉赫曼数据库并每年通过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;

这显示了那个赛季前十名球员的平均值,所以我希望每个赛季都这样做。在我链接的帖子中,我看到他们为他们需要的每一个值做了这件事,但我正在寻找一种不涉及重复相同代码近150年的方法。我之前用Java和C ++编程,所以很自然地我正在寻找一种方法来循环我所拥有的东西,并且只是在今年的ID中加上1。我很难理解如何做到这一点。上面的代码也将yearID作为2004而不是2012返回,但我更有信心解决这个问题,因为我很确定我在其他测试中也有。此外,如果我第一次发布这个代码块时效果不好,我会尝试修复它,因为这是我在这里的第一篇文章。

1 个答案:

答案 0 :(得分:0)

您没有从master表中选择任何内容,因此无需加入..

尝试以下查询。它有一个内部查询,它使用用户定义的变量根据WAR降序进行排名。然后外部查询只查看< = 10的等级,然后按年份分组时进行平均。

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年内每年执行相同的代码。