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

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

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

select top 10 * from #mytable order by rid

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

SELECT * FROM othertable order by newid()

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

Есть предложения?

Ответы [ 3 ]

2 голосов
/ 03 октября 2013

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

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

SELECT top 10 id from TABLE order by NEWID();
0 голосов
/ 28 августа 2013

Вы можете получить случайный эффект, используя функцию 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)
0 голосов
/ 23 марта 2012

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

select (select rand() as rnd) from mytable
...