2012-03-16 80 views
6

我有一些表格,其中包含有关玩家的数据以及他们在联赛期间在保龄球中心击球的比赛数据。这个特定的查询用于排序今年男性和女性的前X平均数。我把所有这一切都放下了,但是在某些特定情况下,当一些球员在多个联赛中打球时,他们的平均数在顶部X中不止一个。在SQL查询中获得每个不同记录的最大平均值

显然,我只想列出最好的所以如果玩家A在ABC联盟中拥有200的最佳平均水平,并且在联盟DEF中拥有198的第二高平均水平,那么我只想要200名玩家。

下面是我想要更改的查询的简化版本,因为现在我必须手动删除重复项,或者我必须用另一种语言编写分拣机,但我宁愿在纯SQL中执行。 (I仅除去从查询这个例子不相关的信息):

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表包含每个单独的游戏,playerId,其中游戏被演奏季节和leagueName(和其他列,其在本例中不需要)。

WHERE是为了确保游戏是在本赛季进行的,并且得分为正(-1表示人在缺席时)。我按赛季,球员ID和联盟名称对所有内容进行了分组,所以我得到了每名球员的平均PER LEAGUE,而不是不同联赛中所有比赛的平均水平。

我尝试使用DISTINCT关键字,但这不起作用,因为我不能仅将DISTINCT用于单列。我也试过其他的东西,但他们都没有接近工作,所以我想知道是否有可能做到这一点,或者如果我不得不求助于使用另一种语言排序这个结果集和删除重复?

回答

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 
+0

非常好,这是我的首选答案,因为它在单个查询中工作而不需要临时表。万分感谢! – 2012-03-16 17:01:57

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中。

希望它有帮助!

+0

这是伟大的,我懂了工作,但我不得不改变一些事情。我用我的问题中的查询创建了tmpScores,然后使用您的第一个SQL查询减去“INTO bestScores”,并在SELECT中添加了我需要的字段,因为tmpScores已经包含了我需要的所有数据。谢谢你,这真的帮了我:) – 2012-03-16 16:51:54

+0

很高兴它为你工作@亚当! – 2012-03-16 16:54:56