1

我有一个表格列表(gameid、playerid、team、max_minions),我想获得每个团队中 max_minions 最低的玩家(在每个团队中,在每个游戏中)。即我想要每个游戏/团队组合的列表(gameid、团队、playerid_with_lowest_minions)。

我试过这个:

SELECT * FROM MinionView GROUP BY gameid, team
HAVING MIN(max_minions) = max_minions;

不幸的是,这似乎不起作用,因为它似乎从每个(gameid,团队)的可用行中选择一个随机行,然后进行 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。

4

1 回答 1

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 值,则将选择所有这些行。如果您只想要其中一个,那么这可能会更复杂一些。

于 2012-06-21T12:07:56.893 回答