在Postgresql 8.2中我想按顺序编号行。我在SQL Fiddle处有t
表:
c
---
3
2
我想要这个:
c | i
---+---
2 | 1
3 | 2
我试过了:
select *
from
(select c from t order by c) s
cross join
generate_series(1, 2) i
得到了:
c | i
---+---
2 | 1
3 | 1
2 | 2
3 | 2
答案 0 :(得分:3)
我唯一能想到的是一个序列。你可以这样做:
drop sequence if exists row_numbers;
create temporary sequence row_numbers;
select next_val('row_numbers'), dt.c
from (select c from t order by c) as dt;
我也会抛出一个drop sequence row_numbers
但temporary
如果你忘了就应该照顾它。
这有点麻烦,但你可以将它包装在一个隐藏一些丑陋的函数中。
请记住,不再支持8.2,但8.4和8.4具有窗口功能。
参考文献(8.2版本):
答案 1 :(得分:2)
您可以使用“三角形连接”,如下所示:
select a.c, (select count(*) from t where c <= a.c) as i
from t as a
order by i
然而,假设c
的值是唯一的,因为“行编号”方案只是小于或等于当前行的行数。根据需要,这可以扩展为包括主键或其他唯一列以打破平局。
此外,可能会有一些performance implications以这种方式加入。