2012-02-24 5 views
2

あなたがそうのようなテーブルを持っている:のPostgreSQL:取得序ランク(行インデックス?)を効率的

id dollars dollars_rank points points_rank 
1 20  1   35  1 
2 18  2   30  3 
3 10  3   33  2 

私は、テーブルの順位の列(dollars_rankpoints_rank)を更新クエリが与えられたためにランクを設定したいですIDは、関連する列で降順でソートされたそのIDの行の索引です。 PostgreSQLでこれを行うにはどうすればよいですか?

+0

結び付きについてはどうですか? [Analytics](http://wiki.postgresql.org/wiki/SQL2008_windowing_queries)... –

+0

彼らはちょうど同じランキングを持つだろう。 – Wells

+0

使用しているポストグルのバージョンは? – Phani

答えて

3

@OMG_Poniesはすでに指摘しています。window function dense_rank()は、あなたが必要とするものです - または多分rank()です。 UPDATEは、次のようになります。

テストケース:

CREATE TEMP TABLE tbl (
    id int 
, dollars int 
, dollars_rank int 
, points int 
, points_rank int 
); 
INSERT INTO tbl VALUES 
(1, 20, 1, 35, 1) 
,(2, 18, 2, 30, 3) 
,(3, 10, 3, 33, 2) 
,(4, 10, 3, 33, 2); -- I put a dupe row in to demonstrate ties. 

UPDATE文:

UPDATE tbl 
SET dollars_rank = r.d_rnk 
    , points_rank = r.p_rnk 
FROM (
    SELECT id 
     , dense_rank() OVER (ORDER BY dollars DESC) AS d_rnk 
     , dense_rank() OVER (ORDER BY points DESC) AS p_rnk 
    FROM tbl 
    ) r 
WHERE tbl.id = r.id 

あなたはのPostgreSQL 8.4以降ウィンドウ関数のために必要です。

関連する問題