2012-02-07 60 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 2012-02-07 08:05:45

+0

期望的结果集不清楚。请指定<点组中的或提供示例。 – 2012-02-07 08:07:07

回答

3

我不知道你问什么。 “分组中的行号”是一个简单的window function应用程序,但我不知道“id数组”是什么意思。

给定的日期是这样的:

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

就是这样!你了解我。谢谢。 – 2012-02-07 08:53:28

+1

@NikolayFominyh:很高兴帮助,我也有熊为邻居,我必须从他们捍卫我的垃圾:) – 2012-02-07 10:23:06

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

这也很好。 – 2012-02-07 08:54:12