1

テーブルリスト(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
...

それが重要な場合は、Python3.1でSqlite3を使用しています。

4

1 に答える 1

2

これはSQLServerにあり、構文がうまく機能することを願っています。

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の値が同じであるメンバーが複数いる場合は、これらすべての行が選択されることに注意してください。それらの1つだけが必要な場合は、おそらくもう少し複雑です。

于 2012-06-21T12:07:56.893 に答える