获取SQL查询中每个不同记录的最大平均值

时间:2012-03-16 15:48:55

标签: sql sqlite aggregate-functions aggregate

我有一些表格,其中包含有关球员的数据以及本赛季他们在联赛中在保龄球中心击败的比赛。这个特定查询的用途是对男性和女性今年的前X平均值进行排序。我把这一切都搞砸了,但是在一些特殊情况下,当一些球员在多个联赛中打球并且在前X中有超过一个平均值时,我仍有问题。

显然,我只想列出给定球员的最佳平均值,所以如果球员A在联盟ABC中的平均得分最高,而联盟DEF的平均得分为198,我只希望列出200。

这是我想要更改的查询的简化版本,因为现在我必须手动删除重复项或者我必须用另一种语言编写分类器,但我宁愿在纯SQL中执行此操作。 (我只从该示例的查询中删除了无关信息):

SELECT playerId, ROUND(AVG(score),2)Average, season, leagueName, COUNT(score)NumGames FROM Scores
WHERE season = '2011-2012' AND score > -1
GROUP BY season, playerID, leagueName
ORDER BY Average DESC LIMIT 0,30

基本上,Scores表包含每个单独的游戏,一个玩家ID,玩游戏的季节和联盟名称(以及本例中不需要的其他列)。

WHERE是为了确保本赛季比赛进行,并且得分为正(-1表示人们不在场时)。我根据赛季,球员ID和联赛名称对所有内容进行分组,因此我得到每个球员的平均PER LEAGUE,而不是在不同联赛中所有比赛的平均值。

我尝试使用DISTINCT关键字,但这不起作用,因为我不能仅将DISTINCT用于单个列。我也尝试了其他的东西,但是它们都没有接近工作,所以我想知道是否甚至可以这样做,或者我是否必须使用另一种语言对这个结果集进行排序并删除重复项?

2 个答案:

答案 0 :(得分:3)

您可以计算子查询中每个联盟的平均每位玩家:

select  playerId
,       max(league_avg.score)
from    (
        select  playerId
        ,       avg(score) as score
        from    Scores
        where   season = '2011-2012' 
                and score > -1
        group by
                playerId
        ,       leagueName
        ) as league_avg
group by
        playerId

答案 1 :(得分:1)

好的,这是一个挑战。我假设您可以使用SELECT xxx INTO表生成临时表?在这种情况下,这两个选项将为您提供所需的内容:

首先,我假设您上面的查询创建了一个名为tmpscores的表。

然后你需要为每位玩家获得最佳分数:

select playerID, MAX(average) AS bestscore
INTO bestscores
FROM tmpscores
GROUP BY playerID, season

最后,拿下bestscores并重新加入临时分数,以获得正确的联赛和比赛数量:

    SELECT bs.playerId, bs.bestscore, ts.season, ts.leaguename, ts.numgames
    FROM bestscores bs
    JOIN tmpscores ts ON bs.playerID = ts.playerId and bs.bestscore = ts.average

有!全部在SQL中。

希望它有所帮助!