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

时间:2012-10-26 18:53:01

标签: sql postgresql postgresql-8.2

在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

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_numberstemporary如果你忘了就应该照顾它。

这有点麻烦,但你可以将它包装在一个隐藏一些丑陋的函数中。

请记住,不再支持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以这种方式加入。