gpt4 book ai didi

sql - 获取按另一列分组的多个 AVG 的 MAX

转载 作者:行者123 更新时间:2023-12-03 17:50:08 24 4
gpt4 key购买 nike

我有一个在保龄球中心使用的查询,用于按降序对所有最佳平均值进行排序。
一切正常,除了如果一个球员在两个不同的联赛中踢球(或者当我没有按赛季分组时,因为每个赛季后的平均值都会重置),我只想要给定球员的最佳平均值,因为我不想要重复. (同一球员不同联赛的平均数不会累积,因此一名球员可以有多个平均数)
在问 Stack Overflow ( here ) 之后,我以为我已经解决了这个问题,但最近,我被告知有时查询存在一些问题,我不知道我怎么没注意到早些时候。
问题是,即使我没有得到重复的名字并且我得到了正确的 MAX 平均值,如果一个球员在多个联赛中踢球,其他列,例如联赛名称、比赛次数和赛季并不总是正确的.这是查询:

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,如果玩家参加多个联赛,则从他参加的联赛。
我想要的是获得与球员及其最大平均值相对应的联赛名称(以及所有其他信息)。
下面是一个例子:
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
如您所见,Smith、Adam 的 AVG 是正确的,但与 Name/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 .

关于sql - 获取按另一列分组的多个 AVG 的 MAX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11255059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com