[英]Numbering rows without window functions
在Postgresql 8.2中,我想按顺序编号行。 我有表t
在SQL小提琴 :
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
我唯一能想到的是序列。 你可以这样做:
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版本):
您可以使用“三角形连接”,如下所示:
select a.c, (select count(*) from t where c <= a.c) as i
from t as a
order by i
然而,这假定c
的值是唯一的,因为“行编号”方案仅仅是小于或等于当前行的行数。 根据需要,这可以扩展为包括主键或其他唯一列以打破平局。
此外,以这种方式加入可能会有一些性能影响 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.