我在保龄球中心使用了一个查询,以降序排列所有最佳平均值。
一切正常,除了如果一个球员参加两个不同的联赛(或者由于每个赛季后均值重置而我没有按赛季分组)时,我只想要给定球员的最佳均值,因为我不想重复。 (同一位球员在不同联赛中的平均得分不会累积,因此一位球员的平均得分可以超过一个)
我以为我是在询问Stack Overflow(here)之后不久就解决了这个问题的,但是最近我被告知有时查询存在一些问题,我不知道怎么没注意到较早。
问题是,即使我没有重复的姓名,也没有获得正确的MAX平均值,但是如果一个球员参加多个联赛,其他列(例如LeagueName,比赛次数和赛季)并不总是正确的。这是查询:
SELECT PlayerID, Name, max(score)Avg, gamesCount, LeagueName, Season
FROM( SELECT PlayerID, Player.Name as Name, Player.Gender as Gender, ROUND(AVG(score),2) as score, COUNT(score) as gamesCount, LeagueName, Season
FROM Scores JOIN Players as Player USING(PlayerID)
WHERE Score > -1 AND bowlout = 'No' AND season = '2011-2012'
GROUP BY PlayerID, LeagueName, Season
HAVING gamesCount >= 50
) as league_avg
WHERE Gender = 'Male'
GROUP BY PlayerID
ORDER BY Avg DESC LIMIT 0,50;
显然,这是行不通的,因为外部查询仅按PlayerID分组,因此它获取了玩家的最大AVG,但是其他字段(例如,如果有多个玩家参加的联赛,则是LeagueName)是从以下字段中随机选择的他参加的联赛。
我想要获得与玩家及其最高平均水平相对应的LeagueName(以及所有其他信息)。
这是一个例子:
Name | AVG | LeagueName
Jones, Tom 122.56 Friday League
Smith, Adam 182.42 Super League
Smith, Adam 194.25 Friendly League
...
预期结果将是:
Name | AVG | LeagueName
Smith, Adam 194.25 Friendly League
Jones, Tom 122.56 Friday League
我得到的是:
Name | AVG | LeagueName
Smith, Adam 194.25 *Super League*
Jones, Tom 122.56 Friday League
如您所见,史密斯,亚当拥有正确的AVG,但与“名称/平均”组合相关的联盟错误。
我尝试将外部GROUP BY子句更改为PlayerID,LeagueName,Season,但这只是每个赛季每个联赛的重新分配,然后我又将副本重新找回。除了只使用其中的Java应用程序,获取所有结果并删除Java中的重复项外,我不知道该尝试什么。显然,我宁愿第一次从SQL查询中获得正确的结果。
附带说明一下,即使在本文的前面已经提到过,有时查询中也不会包含“ AND season ='2011-2012'”部分,因此我也不能在同一季节中获得同一名球员的重复比赛。
编辑:我正在使用SQLite,以防某些人没有注意到标签。
最佳答案
我相信这样的事情应该起作用。
SELECT PlayerID,
Name,
Season,
CAST( SUBSTR(MAX(stats),1,10) AS REAL) AS Average,
CAST( SUBSTR(MAX(stats),11,10) AS INTEGER) AS GamesCount,
SUBSTR(MAX(stats),21) AS LeagueName
FROM (
SELECT PlayerID,
Player.Name as Name,
Season,
CASE WHEN LENGTH(ROUND(AVG(score),2))-(LENGTH(CAST(AVG(score) AS INTEGER)))=2
THEN SUBSTR(' '||(ROUND(AVG(score),2))||'0', -10,10)
ELSE SUBSTR(' '||(ROUND(AVG(score),2)), -10,10)
END || SUBSTR(' '||COUNT(score),-10,10) || LeagueName as stats
FROM Scores
JOIN Players as Player USING(PlayerID)
WHERE Score > -1
AND bowlout = 'No'
GROUP BY PlayerID, Player.Name, LeagueName, Season
HAVING COUNT(score) >= 50
) AS league_avg
WHERE Season = '2011-2012'
GROUP BY PlayerID, Name, Season
ORDER BY Average DESC LIMIT 0,50
;
我从未使用过SQLite,因此如果语法错误,请不要感到惊讶。它尝试将Average,GameCount和LeagueName连接到一个字符串中,该字符串可以按Average轻松排序,还可以使用子字符串操作轻松提取组件。
我最不确定的部分是平均值的格式。我使用发现的at the bottom of this link语法。