Я думал о том, как бы вы решили эту проблему, не упорядочивая все записи, особенно несколько раз.
Один из способов - генерировать случайные числа и использовать их для поиска значений в ваших данных:
with n as (
select rand(checksum(newid())) as r, 1 as n
union all
select rand(checksum(newid())) as r, n + 1
from n
where n < 10
),
tt as (
select t.*, lag(tile_end, 1, 0) over (order by tile_end) as tile_start
from (select t.*, row_number() over (order by newid()) * 1.0 / count(*) over () as tile_end
from t
) t
)
select tt.*, n.r, (select count(*) from n)
from n left join
tt
on n.r >= tt.tile_start and n.r < tt.tile_end;
Здесь - это дБ <> скрипка.row_number()
не нужно использовать order by newid()
.Он может быть упорядочен по ключу с индексом, что делает этот компонент намного более эффективным.
Для более чем 100 строк вам потребуется OPTION (MAXRECURSION 0)
.