2012-02-24 3 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_rank и points_rank), чтобы установить ранг для данного ID, который является только индексом строки для этого идентификатора, отсортированным соответствующим столбцом в порядке убывания. Как лучше всего сделать это в PostgreSQL?

+0

Как насчет связей? [Аналитика] (http://wiki.postgresql.org/wiki/SQL2008_windowing_queries) ... –

+0

Они будут иметь одинаковый рейтинг. – Wells

+0

Какую версию postgres вы используете? – 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 или более поздней версии для оконных функций.