2012-02-07 9 views
1

postgresqlのクエリ行を列挙する方法はありますか?postgresqlの列挙

Table players 
id player_id game_id points 

そして、私はこのようなクエリを実行します:

は、私はこのようなテーブルを持って

SELECT game_id, <row_number in points group>, <array of ids> 
    FROM players WHERE game_id = %s 
    GROUP BY game_id, points; 
+2

回答が必要な場合は、サンプルデータ(入力と出力)を追加します。あなたが望むものが明確でない – gbn

+0

希望の結果セットが不明です。 を指定するか、例を挙げてください。 –

答えて

3

私はあなたが求めているかわからないんだけど。 "ポイント数グループの行番号"は、直線的なwindow functionアプリケーションですが、 "idsの配列"の意味はわかりません。このような日付を考えると

id | player_id | game_id | points 
----+-----------+---------+-------- 
    1 |   1 |  1 |  0 
    2 |   1 |  2 |  1 
    3 |   1 |  3 |  5 
    4 |   2 |  1 |  1 
    5 |   2 |  2 |  0 
    6 |   2 |  3 |  0 
    7 |   3 |  1 |  2 
    8 |   3 |  2 |  3 
    9 |   3 |  3 |  1 

あなたはこれにあたり-ゲームランキングを取得することができます。

select game_id, player_id, points, 
     rank() over (partition by game_id order by points desc) 
from players 

このようにあなたの出力が得られます:

game_id | player_id | points | rank 
---------+-----------+--------+------ 
     1 |   3 |  2 | 1 
     1 |   2 |  1 | 2 
     1 |   1 |  0 | 3 
     2 |   3 |  3 | 1 
     2 |   1 |  1 | 2 
     2 |   2 |  0 | 3 
     3 |   1 |  5 | 1 
     3 |   3 |  1 | 2 
     3 |   2 |  0 | 3 
+0

それだけです!あなたは私を理解した。ありがとう。 –

+1

@NikolayFominyh:喜んで助けてくれる、私は隣人のためのクマも持っており、私はそれらから自分のゴミを守る必要があります:) –

3

このあなたが探しているものを行う必要があります:

SELECT game_id 
, row_number() OVER (PARTITION BY game_id ORDER BY points) AS num 
, array_agg(id) AS ids 
FROM players WHERE game_id = %s 
GROUP BY game_id, points 
ORDER BY game_id, points 
+0

それも良いです。 –