繁体   English   中英

对没有窗口函数的行进行编号

[英]Numbering rows without window functions

在Postgresql 8.2中,我想按顺序编号行。 我有表tSQL小提琴

    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM