SQL查询按先前数据的最高平均值排序

时间:2016-04-19 22:11:19

标签: mysql subquery

给定一个包含这些列数据的表(其他列也是如此,但这些是重要的列):

gameid awayscore homescore
1      3         8
2      4         2
3      4         9
4      15        5
5      0         8
6      4         10
...

我正在寻找的是获得前3场比赛的平均胜利率(假设gameid是他们的比赛顺序),因此,在第6场比赛中,应该是(6 + 8 + 10 = 24,平均8),在第5场比赛(8 + 10 + 5 = 23,平均7.666)等等。然后显示3场比赛平均值最高的周数。

我试着这样做:

SELECT g.gameid,
(SELECT AVG(scores.ave) FROM (SELECT ABS(awayscore-homescore) ave FROM games gs
WHERE (gs.gameid<=g.gameid)
ORDER BY gameid DESC LIMIT 3) scores) margin
FROM `games` g
GROUP BY g.gameid
ORDER BY margin DESC 
LIMIT 10;

但是我在'where子句'中得到“未知列'g.gameid'”,我假设因为它是子查询(?)的子查询,并且它丢失了引用?我不知道如何构建它,否则虽然工作正常(如果可能的话)。

1 个答案:

答案 0 :(得分:0)

尝试此查询

SELECT g.gameid,
   (SELECT AVG(ABS(awayscore-homescore))
      FROM games gs
       WHERE (gs.gameid<=g.gameid)
             AND (gs.gameid>g.gameid-3)
    ) margin
FROM `games` g
ORDER BY margin DESC 
LIMIT 10;

sqlfiddle

更新如果您想使用gamedate(日期时间)来订购游戏,您可以在每次从以下查询中选择游戏时根据此类别创建游戏订单(gorder)编号。

SELECT g.gameid,
   (SELECT AVG(ABS(awayscore-homescore))
      FROM 
       (SELECT awayscore,homescore,@rank:=@rank+1 as gorder
        FROM games,(SELECT @rank:=0)r
        ORDER BY gamedate ASC
        )gs
       WHERE (gs.gorder <= g.gorder)
             AND (gs.gorder > g.gorder-3)
    ) margin
FROM (SELECT games.gameid,@rank2:=@rank2+1 as gorder
        FROM games,(SELECT @rank2:=0)r2
        ORDER BY gamedate ASC) g
ORDER BY margin DESC 
LIMIT 10;

sqlfiddle