Я хотел бы случайным образом сортировать результат повторяемым образом для таких целей, как пейджинг. Для этого NEWID() слишком случайный в том смысле, что одни и те же результаты не могут быть получены повторно. Заказ по Rand(seed) был бы идеальным, так как с одним и тем же семенем получится одна и та же случайная коллекция. К сожалению, состояние Rand() сбрасывается с каждой строкой, у кого-нибудь есть решение?
declare @seed as int;
set @seed = 1000;
create table temp (
id int,
date datetime)
insert into temp (id, date) values (1,'20090119')
insert into temp (id, date) values (2,'20090118')
insert into temp (id, date) values (3,'20090117')
insert into temp (id, date) values (4,'20090116')
insert into temp (id, date) values (5,'20090115')
insert into temp (id, date) values (6,'20090114')
-- re-seeds for every item
select *, RAND(), RAND(id+@seed) as r from temp order by r
--1 2009-01-19 00:00:00.000 0.277720118060575 0.732224964471124
--2 2009-01-18 00:00:00.000 0.277720118060575 0.732243597442382
--3 2009-01-17 00:00:00.000 0.277720118060575 0.73226223041364
--4 2009-01-16 00:00:00.000 0.277720118060575 0.732280863384898
--5 2009-01-15 00:00:00.000 0.277720118060575 0.732299496356156
--6 2009-01-14 00:00:00.000 0.277720118060575 0.732318129327415
-- Note how the last column is +=~0.00002
drop table temp
-- interestingly this works:
select RAND(@seed), RAND()
--0.732206331499865 0.306382810665955
Обратите внимание, я попробовал Rand(ID), но оказалось, что это отсортировано. Очевидно Rand(n) ‹ Rand(n+1)