根据该列中的排序值重新编号 postgresql 中的列
Renumbering a column in postgresql based on sorted values in that column
编辑:我正在使用 postgresql v8.3
我有一个 table,其中包含我们可以称为 A 列的列。
出于我们的目的,A 列填充了任意正整数。
我想根据 table 的记录按 A 列升序对 A 列重新编号,从 1 到 N。 (SELECT * 来自 table 按 ASC 排序;)
有没有无需构建 postgresql 函数即可完成此操作的简单方法?
示例:
(之前:
答:3,10,20,100,487,1,6)
(后:
答:2,4,5,6,7,1,3)
使用 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)
如果 window 函数不可用,您仍然可以计算任何行之前的行数:
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
)
;
编辑:我正在使用 postgresql v8.3
我有一个 table,其中包含我们可以称为 A 列的列。
出于我们的目的,A 列填充了任意正整数。
我想根据 table 的记录按 A 列升序对 A 列重新编号,从 1 到 N。 (SELECT * 来自 table 按 ASC 排序;)
有没有无需构建 postgresql 函数即可完成此操作的简单方法?
示例:
(之前: 答:3,10,20,100,487,1,6) (后: 答:2,4,5,6,7,1,3)
使用 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)
如果 window 函数不可用,您仍然可以计算任何行之前的行数:
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
)
;