根据该列中的排序值重新编号postgresql中的列

时间:2015-01-14 16:35:11

标签: postgresql sorting relational-database postgresql-8.3

编辑:我正在使用postgresql v8.3

我有一个表格,其中包含一个我们可以称为A列的列。

为了我们的目的,列A填充了任意正整数。

我想基于按列A升序排序表的记录,将列A从1重新编号为N. (SELECT * FROM table ORDER BY ASC;)

是否有一种简单的方法可以在不需要构建postgresql函数的情况下完成此任务?

示例:

(前: 答:3,10,20,100,487,1,6) (后: 答:2,4,5,6,7,1,3)

1 个答案:

答案 0 :(得分:2)

使用rank()(或dense_rank())WINDOW函数(自PG-8.4起可用):

create table aaa
        ( id serial not null primary key
        , num integer not null
        , rnk integer not null default 0
        );
insert into aaa(num) values( 3) , (10) , (20) , (100) , (487) , (1) , (6)
        ;

UPDATE aaa
SET rnk = w.rnk
FROM (
        SELECT id
        , rank() OVER (order by num ASC) AS rnk
        FROM aaa
        ) w
WHERE w.id = aaa.id;

SELECT * FROM aaa
ORDER BY id
        ;

结果:

CREATE TABLE
INSERT 0 7
UPDATE 7
 id | num | rnk 
----+-----+-----
  1 |   3 |   2
  2 |  10 |   4
  3 |  20 |   5
  4 | 100 |   6
  5 | 487 |   7
  6 |   1 |   1
  7 |   6 |   3
(7 rows)

如果IF窗口功能不可用,您仍然可以计算任意行之前的行数:

UPDATE aaa
SET rnk = w.rnk
FROM (  SELECT a0.id AS id
        , COUNT(*) AS rnk
        FROM aaa a0
        JOIN aaa a1 ON a1.num <= a0.num
        GROUP BY a0.id
        ) w
WHERE w.id = aaa.id;

SELECT * FROM aaa
ORDER BY id
        ;

或者与标量子查询相同:

UPDATE aaa a0
SET rnk =
        ( SELECT COUNT(*)
        FROM aaa a1
        WHERE a1.num <= a0.num
        )
        ;