所以我搜索过并发现了许多类似于我的问题 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返回,但我更有信心解决这个问题,因为我很确定我在其他测试中也有。此外,如果我第一次发布这个代码块时效果不好,我会尝试修复它,因为这是我在这里的第一篇文章。
答案 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
这样,您只需在查询末尾添加ORDER BY T.yearID DESC
或ORDER BY T.yearID ASC
即可获得所有结果,而不会在150年内每年执行相同的代码。