Производительность может быть проблемой с этим методом.
declare @mytable table (timestamp datetime, ID int, category varchar(150))
insert into @mytable
values ('10/21/19 1:00AM', 1, 'A'),
('10/21/19 2:00AM', 2, 'B'),
('10/21/19 3:00AM', 3, 'A'),
('10/21/19 4:00AM', 4, 'B'),
('10/21/19 5:00AM', 5, 'A'),
('10/21/19 6:00AM', 6, 'A'),
('10/21/19 7:00AM', 7, 'A'),
('10/21/19 8:00AM', 8, 'A'),
('10/21/19 9:00AM', 9, 'A'),
('10/21/19 10:00AM', 10, 'A'),
('10/21/19 11:00AM', 11, 'A'),
('10/21/19 12:00AM', 12, 'A'),
('10/21/19 1:00PM', 13, 'A'),
('10/21/19 2:00PM', 14, 'A'),
('10/21/19 3:00PM', 15, 'A'),
('10/21/19 4:00PM', 16, 'A'),
('10/21/19 5:00PM', 17, 'A'),
('10/21/19 6:00PM', 18, 'A'),
('10/21/19 7:00PM', 19, 'A'),
('10/21/19 8:00PM', 20, 'A'),
('10/21/19 6:00PM', 21, 'B')
select timestamp, id, category
from (
select *, row_number() over (partition by category order by newid()) rown
from @mytable
) a
where rown=1
Я думаю, вы также можете использовать свой случайный код. Я не знаю, как 2 метода будут сравниваться для распространения. РЕДАКТИРОВАТЬ Я добавил ID к заказу. Это делает результат повторяемым даже в (очень) маловероятном случае, когда случайный код столкнулся.
...
select timestamp, id, category
from (
select *, row_number() over (partition by category order by RAND(ID)*100000-FLOOR(RAND(ID)*100000),ID) rown
from @mytable
) a
where rown=1