2012-02-27 35 views
0

我试图做同样的事情到this但额外的复杂性,我需要组由共同领域PostgreSQL的排名查询

我有两个表,一个是competition_users(对那些在比赛中竞争)和另一competition_times(存储他们最快的时间),但同一张桌子上有许多不同的比赛。

我已经创造了competition_times表中的新列rank现在需要运行现有用户展示自己的排名在其竞争的更新,我想修改其他给出的解决方案没有成功

SO回答

表是如下...

competition_users:

competition_user_idcompetition_id

competition_times:

competition_time_idcompetition_user_idtime_in_secondsrank

我不知道,如果它可以使用GROUP BY?或者,如果有另一种方式,到目前为止,我想这样的事情...

UPDATE competition_times 
SET rank = r.rnk 
FROM (
    SELECT competition_time_id 
     , dense_rank() OVER (ORDER BY time_in_seconds ASC) AS rnk 
    FROM competition_times, competition_users 
    WHERE competition_times.competition_user_id = competition_users.competition_user_id 
    GROUP BY competition_users.competition_id 
    ) r 
WHERE competition_times.competition_time_id = r.competition_time_id 

使用PostgreSQL 9

感谢

+1

而你的问题是? – 2012-02-27 20:07:08

+0

是否应该在'competition_users'表上也有'rank'字段(这是你的SQL建议的)? – tomtheguvnor 2012-02-27 20:12:12

+0

@tomtheguvnor不,这是一个复制和粘贴错误,排名是针对比赛时间(因为这是一个时间点快照) – DaveB 2012-02-27 20:44:00

回答

5

您需要使用PARTITION BY子句中的窗口功能,以保持比赛之间的队伍分开。

UPDATE competition_times 
SET  
    rank = r.rnk 
FROM (
    SELECT competition_time_id, dense_rank() OVER (PARTITION BY competition_id ORDER BY time_in_seconds ASC) AS rnk 
    FROM competition_times 
    INNER JOIN competition_users 
     ON competition_times.competition_user_id = competition_users.competition_user_id 
    ) r 
WHERE competition_times.competition_time_id = r.competition_time_id 

与下面的示例数据:

create table competition_users 
(competition_user_id int, competition_id int); 

create table competition_times 
(competition_time_id int, competition_user_id int, time_in_seconds int, rank int); 

insert into competition_users values 
(1,1),(2,1),(3,1),(4,1),(5,2),(6,2); 

insert into competition_times values 
(1,1,10,null), 
(2,2,20,null), 
(3,3,15,null), 
(4,4,15,null), 
(5,5,10,null), 
(6,6,7,null); 

我得到的结果在competition_times:

competition_time_id competition_user_id time_in_seconds rank 
1     1     10    1 
2     2     20    3 
3     3     15    2 
4     4     15    2 
5     5     10    2 
6     6     7    1 

凡行1-4是在一个竞争,和行5 & 6来自另一个。

+0

非常棒,谢谢Gary的工作,我没有意识到Partition By子句 – DaveB 2012-02-28 08:27:41