Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сортировка в случайно порядке, но без совпадения с исходной  [new]
BioVR
Member

Откуда: Москва
Сообщений: 31
Всем привет!
Возможно несколько сумбурно написано в теме. Нужно получить сортировку значений отличную от исходной.
Т.е. есть таблица
Id Answer
1 A
2 B
3 C

Мне нужно из нее получить выборку в случайном порядке, но чтобы она не была в последовательности id.
Случайный порядок:
SELECT [Id], [Answer] FROM T ORDER BY NEWID()

Но как здесь указать, что если получилась последовательность равная порядку по id - то пересортировать?
На ум приходит только цикл, но может есть более простые решения?
13 сен 16, 16:13    [19660155]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в случайно порядке, но без совпадения с исходной  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
BioVR,

select * into #temp
from (values (1, 'a'), (2, 'b'), (3, 'c')) a (id, num) 

select * from 
(select *, row_number() over(order by newid()) nn from  #temp where id /2 *2 = id) a
union all
select * from 
(select *, row_number() over(order by newid()) nn from #temp  where id /2 *2 != id) a
order by nn
13 сен 16, 16:32    [19660266]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в случайно порядке, но без совпадения с исходной  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
эх минус забыл:)



select * from 
(select *, -row_number() over(order by newid()) nn from  #temp where id /2 *2 = id) a
union all
select * from 
(select *, row_number() over(order by newid()) nn from #temp  where id /2 *2 != id) a
order by nn
13 сен 16, 16:33    [19660284]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в случайно порядке, но без совпадения с исходной  [new]
BioVR
Member

Откуда: Москва
Сообщений: 31
WarAnt, Спасибо!
Интересное решение, но одно и тоже значение всегда остается первым (в данном случае 2-ое). Что в целом снижает разброс значений. Но по большому счету можно генерировать переменную, которая будет заменять 2*2, типа @C * @C.
select * into #temp
from (values (1, 'a'), (2, 'b'), (3, 'c')) a (id, num) 
declare @C int
select @C = ROUND(2+RAND(),0)
select * from 
(select *, -row_number() over(order by newid()) nn from  #temp where id /@C *@C = id) a
union all
select * from 
(select *, row_number() over(order by newid()) nn from #temp  where id /@C *@C != id) a
order by nn
drop table #temp
13 сен 16, 17:08    [19660509]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка в случайно порядке, но без совпадения с исходной  [new]
aleks2
Guest
BioVR
На ум приходит только цикл, но может есть более простые решения?

Убери ID... совсем.
13 сен 16, 17:31    [19660656]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить