firebird 2.5 用序号标记记录

jir*_*nek 5 firebird ordinal firebird2.5

我想用序号标记特定记录的每次出现。如果在“id”列中我有六倍相同的值,我需要将它们标记如下:第一次出现“1”,第二次出现“2”,第三次出现“3”在其他列等。

提前感谢您提供任何线索。

Mar*_*eel 5

使用 Firebird 3,您可以使用row_number窗口函数,例如:

select row_number() over (order by id, some_column), id, other_columns
from mytable
Run Code Online (Sandbox Code Playgroud)

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

select row_number() over (partition by id order by some_column), id, other_columns
from mytable
Run Code Online (Sandbox Code Playgroud)

如果你被困在 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
Run Code Online (Sandbox Code Playgroud)

如果你想有类似partition by的效果,那么你需要跟踪id值,并在id值变化时重置计数器。

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

或者,如果您只是在寻找唯一标识记录的方法,则可以添加RDB$DB_KEY伪列:

select rdb$db_key, id, other_columns 
from mytable 
order by id, some_column
Run Code Online (Sandbox Code Playgroud)

rdb$db_key唯一标识表中的记录(在最小的事务的持续时间)。