3

在 Postgresql 8.2 中,我想对行进行顺序编号。我tSQL Fiddle有一张桌子:

    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
4

2 回答 2

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 版本):

于 2012-10-26T19:27:26.683 回答
2

您可以使用“三角连接”,如下所示:

select a.c, (select count(*) from t where c <= a.c) as i
from t as a
order by i

但是,这假定 的值c是唯一的,因为“行编号”方案只是对小于或等于当前行的行的计数。如有必要,这可以扩展为包括一个主键或其他用于平局的唯一列。

此外,以这种方式加入可能会对性能产生一些影响。

于 2012-10-26T20:26:23.570 回答