我有一个表格列表(gameid,playerid,team,max_minions),我想让每个团队中的玩家拥有最低的max_minions(在每个游戏中,每个游戏中)。即我想为每个游戏/团队组合提供一个列表(gameid,team,playerid_with_lowest_minions)。
我试过了:
SELECT * FROM MinionView GROUP BY gameid, team
HAVING MIN(max_minions) = max_minions;
不幸的是,这似乎不起作用,因为它似乎从每个(gameid,team)的可用行中选择一个随机行,然后进行HAVING比较。如果随机选择的行不匹配,则只是跳过它。
使用WHERE也不起作用,因为您不能在WHERE子句中使用聚合函数。 LIMIT不起作用,因为我有更多的游戏和LIMIT限制返回的总行数。
如果没有添加包含(gameid,teamid,MIN(max_minions))的另一个表/视图,有没有办法做到这一点?
示例数据:
sqlite> SELECT * FROM MinionView;
gameid|playerid|team|champion|max_minions
21|49|100|Champ1|124
21|52|100|Champ2|18
21|53|100|Champ3|303
21|54|200|Champ4|356
21|57|200|Champ5|180
21|58|200|Champ6|21
64|49|100|Champ7|111
64|50|100|Champ8|208
64|53|100|Champ9|8
64|54|200|Champ0|226
64|55|200|ChampA|182
64|58|200|ChampB|15
...
预期结果(我主要关注的是playerid,但包括冠军,max_minions这里有更好的概述):
21|52|100|Champ2|18
21|58|200|Champ6|21
64|53|100|Champ9|8
64|58|200|ChampB|15
...
如果重要的话,我在Python 3.1下使用Sqlite3。
答案 0 :(得分:2)
这是在SQL Server中,希望语法也适用于你:
SELECT
MV.*
FROM
(
SELECT
team, gameid, min(max_minions) as maxmin
FROM
MinionView
GROUP BY
team, gameid
) groups
JOIN MinionView MV ON
MV.team = groups.team
AND MV.gameid = groups.gameid
AND MV.max_minions = groups.maxmin
用文字表示,首先进行常规的分组查询(嵌套查询)。此时,您拥有每个组的最小值,但您不知道它属于哪一行。为此你加入原始表并匹配“键”(团队,游戏和分钟)以获得其他列。
请注意,如果一个团队将拥有多个具有相同max_minions值的成员,那么将选择所有这些行。如果你只想要其中一个,那可能会有点复杂。