2012-02-24 34 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)... – 2012-02-24 03:13:49

+0

他們只會有相同的排名。 – Wells 2012-02-24 03:19:16

+0

您使用的是哪個版本的postgres? – Phani 2012-02-24 03:20:49

回答

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或更高版本的窗口功能。