firebird 2.5用顺序号标记记录

时间:2017-02-05 11:03:25

标签: firebird firebird2.5 ordinal

我希望用序号标记每次出现的特定记录。如果在列#id;'我有六倍相同的值我需要标记如下:第一次出现' 1'第二次得到' 2'第三次获得' 3'在其他专栏等。

提前感谢任何线索。

1 个答案:

答案 0 :(得分:3)

使用Firebird 3,您可以使用row_number window function,例如:

select row_number() over (order by id, some_column), id, other_columns
from mytable

或者,如果要为每个id值重新开始计数:

select row_number() over (partition by id order by some_column), id, other_columns
from mytable

如果你被困在Firebird 2.5上,你将不得不采用一些技巧来做到这一点:

一个选项是使用execute block(或存储过程)向结果集添加额外的递增值:

execute block
   returns (counter int, id int, other_columns varchar(32))
as
begin
    counter = 0;
    for select id, other_columns from mytable order by id, some_column into :id, :other_columns
    do
    begin
      counter = counter + 1;
      suspend;
    end
end

如果你想获得与分区相似的效果,那么你需要跟踪id值,并在id的值改变时重置计数器。

另一种选择是使用带序列+触发器的临时表来添加唯一列。我也看过使用递归CTE的解决方案,但我不知道如何自己做(和IIRC你可能遇到一些限制)。

或者,如果您只是想要一种唯一标识记录的方法,可以添加RDB$DB_KEY伪列:

select rdb$db_key, id, other_columns 
from mytable 
order by id, some_column

rdb$db_key唯一标识表中的记录(至少在交易期间)。