Как пронумеровать блоки записей по N строк в таблице?
Имеется таблица, в которой необходимо назначить порядковый номер на каждую группу из N строк.
То есть, первым N записям назначается номер 1, записям с N + 1 до 2N - номер 2, и т. д.
Пока решил вопрос в тупую: сделал хранимую процедуру и в цикле перебираю все записи и назначаю номера, затем update на этот набор и переход к следующей группе
Не проверял на MS SQL Server'е, но он вроде умеет в CTE и оконные функции:
with t as (
select
id,
((row_number() over (order by id) - 1) / N) + 1 as group_id
from some_table
)
update some_table set
some_talbe.group_id = t.group_id
from t
where some_table.id = t.id;
Ещё вопрос, сейчас добавил where и получилось, что обновление идёт не по порядку следования записей в таблице, это как-нибудь можно обеспечить с этим подходом?
а. добавляем сортировку (5 секунд на 1 ядре CPU E5645 с 77000 записей, sql 2005)
declare @i int
set @i=1
update [tbl] set group_number=floor(@i/5),@i=@i+1 where number in (select top 100000 number from [tbl] order by number)
select * from [tbl]
б. ответ Сергей Горностаев про оконные функции и сортировку вида row_number() over (order by id)