Выбор случайного подмножества в SQL (Sybase Server IQ)

Я пытаюсь выбрать случайное подмножество записей, используя rand() или newid(), но каждый раз, когда я запускаю следующее, я всегда получаю одни и те же результаты:

SELECT *,rand() as rid
INTO #mytable
FROM othertable

select top 10 * from #mytable order by rid

Я пробовал все варианты этого, но кажется, что sybase server iq всегда возвращает одно и то же значение rand(), когда я делаю это, как указано выше. Когда я пытаюсь сделать

SELECT * FROM othertable order by newid()

Я получаю сообщение об ошибке, говорящее о том, что использование newid() в порядке следования является незаконным.

Какие-либо предложения?


person user1167650    schedule 20.03.2012    source источник
comment
Вы захотите увидеть генератор случайных чисел, прежде чем делать вызовы rand(). Я предлагаю вам поместить его в хранимую процедуру; затем вы можете заполнить генератор случайных чисел, а затем выполнить первый запрос. ORDER BY NEWID() характерен для MS SQL Server, поэтому он не будет работать в Sybase. Следующая тема может оказаться полезной: database.ittoolbox.com/groups/technical-functional/sybase-l/   -  person David Faber    schedule 20.03.2012
comment
Я думаю, вы имеете в виду seed генератор случайных чисел...   -  person Jonathan B    schedule 21.03.2012


Ответы (3)


В Sybase T-SQL системная функция NEWID() генерирует удобочитаемые глобально уникальные идентификаторы. Включите системную функцию NEWID() в предложение ORDER BY при выполнении оператора SELECT для целевой таблицы.

Использование:

SELECT top 10 id from TABLE order by NEWID();
person user1126070    schedule 03.10.2013

Случайные значения в механизме IQ являются детерминированными, инициируйте запрос через механизм ASA, как показано ниже (предупреждение: это медленно, если у вас много строк).

select (select rand() as rnd) from mytable
person Roland    schedule 23.03.2012

Вы можете получить случайный эффект, используя функцию row_number() и текущие значения времени. Попробуйте что-то вроде этого:

with q as (
    SELECT
        *,
        row_number() over (order by cPublisher) n, -- getting row number
        DATEPART(ms, now()) t -- getting current ms value
    FROM 
        #mytable
)

select top 10
    *
from
    q
order by 
    -- order by some combination t and n, for example t * n and sort it like char
    cast(t * n as char)
person Vadim Zin4uk    schedule 28.08.2013
comment
Я пытаюсь понять, почему это дает случайный порядок. Кажется, что t * n может легко монотонно возрастать. Возможно, вам нужен какой-то случайный хэш из t и n вместо t * n. - person LarsH; 06.09.2019