firebird 2.5 用序号标记记录
firebird 2.5 marking records with ordinal number
我想用序号标记每次出现的特定记录。如果在 'id' 列中我有六倍相同的值,我需要将它们标记如下:第一次出现为“1”,第二次出现为“2”,第三次出现为“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
如果想达到和partition by类似的效果,那么就需要跟踪id的值,当id的值变化时,重新设置计数器。
另一种选择是使用带有序列 + 触发器的临时 table 来添加唯一列。我也看到了使用递归 CTE 的解决方案,但我自己并不完全知道如何做到这一点(并且 IIRC 你可能 运行 在那里遇到一些限制)。
或者,如果您只是在寻找一种唯一标识记录的方法,您可以添加 RDB$DB_KEY
pseudo-column:
select rdb$db_key, id, other_columns
from mytable
order by id, some_column
rdb$db_key
唯一标识 table 中的记录(至少在交易期间)。
我想用序号标记每次出现的特定记录。如果在 'id' 列中我有六倍相同的值,我需要将它们标记如下:第一次出现为“1”,第二次出现为“2”,第三次出现为“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
如果想达到和partition by类似的效果,那么就需要跟踪id的值,当id的值变化时,重新设置计数器。
另一种选择是使用带有序列 + 触发器的临时 table 来添加唯一列。我也看到了使用递归 CTE 的解决方案,但我自己并不完全知道如何做到这一点(并且 IIRC 你可能 运行 在那里遇到一些限制)。
或者,如果您只是在寻找一种唯一标识记录的方法,您可以添加 RDB$DB_KEY
pseudo-column:
select rdb$db_key, id, other_columns
from mytable
order by id, some_column
rdb$db_key
唯一标识 table 中的记录(至少在交易期间)。