2017-02-05 3 views
4

Я хотел бы отметить каждое появление определенной записи порядковым номером. Если в столбце «id» у меня есть шесть раз то же значение, мне нужно отметить их следующим образом: первое появление получает «1», второе - «2», третье - «3» в другой колонке и т. Д.firebird 2.5 отметки с порядковым номером

Заранее благодарю для любой подсказки.

+1

Вы застряли на Firebird 2.5, потому что это возможно в Firebird 3, используя функцию окна ['row_number'] (https://www.firebirdsql.org/file/documentation/release_notes/html/en/3_0/rnfb30 -dml-windowfuncs.html # d0e5655). –

+0

Да, я не могу обновить/перенести на Firebird 3. – jirzinek

ответ

2

С 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 однозначно идентифицирует запись в таблице (как минимум для продолжительность транзакции).

+0

Он работает (я использовал решение «выполнить блок»). Большое спасибо Марку. – jirzinek

+0

было только древнее решение с использованием генераторов без GTT, но, очевидно, только для монополистического использования. Древний трюк для отмены длинных отборов был также: -D –

Смежные вопросы