2012-02-27 79 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