С 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.
Другим вариантом является использование временных таблиц с помощью последовательности + триггер для добавления уникального столбца. Я также видел решения с использованием рекурсивного CTE, но я точно не знаю, как это сделать (и IIRC вы можете столкнуться с некоторыми ограничениями там).
С другой стороны, если вы просто ищете способ, чтобы однозначно идентифицировать запись, вы можете добавить RDB$DB_KEY
псевдо-колонки:
select rdb$db_key, id, other_columns
from mytable
order by id, some_column
rdb$db_key
однозначно идентифицирует запись в таблице (как минимум для продолжительность транзакции).
Вы застряли на Firebird 2.5, потому что это возможно в Firebird 3, используя функцию окна ['row_number'] (https://www.firebirdsql.org/file/documentation/release_notes/html/en/3_0/rnfb30 -dml-windowfuncs.html # d0e5655). –
Да, я не могу обновить/перенести на Firebird 3. – jirzinek