次の方法で共有


Выборка случайных записей

Достаточно распространенная задача с выборкой заданного количества случайных записей во всех СУБД делается примерно одинаково, но синтаксис немного отличается. Вот, собрал для заметки способы получения 10 случайных записей в самых популярных БД.

SQL Server

SELECT TOP 10 Title, Text FROM BlogPosts ORDER BY NEWID()

Oracle

SELECT Title, Text FROM  (SELECT Title, Text FROM BlogPosts ORDER BY dbms_random.value) WHERE rownum <= 10

MySQL

SELECT Title, Text FROM BlogPosts ORDER BY RAND() LIMIT 10

DB2

SELECT Title, Text, RAND() as IDX FROM BlogPosts ORDER BY IDX FETCH FIRST 10 ROWS ONLY

Comments

  • Anonymous
    April 25, 2008
    Если функции RAND - это функция равномерного распределения на заданном интервале, то NEWID() - это GUID, распределение которого вряд ли является равномерным. Хотя, конечно, надо смотреть алгоритм формирования GUID-а. По-любому в MSSQL есть функция RAND() для равномерного распределения. С ней запрос будет выглядеть не короче MySQL.

  • Anonymous
    April 25, 2008
    А дело не в длине запроса и не в равномерности распределения. Задача - выбрать несколько строк случайным образом. С GUID получается вполне неплохо.

  • Anonymous
    April 30, 2008
    В случае большых таблиц, такой метод использования RAND() может создать проблемы, связанные с производительностью (по крайнер мере, в MySQL), т.к. перед применением "рандомизации" СУБД должна будет пройтись по всем записям таблицы (или же по полному индексному дереву, если это возможно). Альтернативой данному решению есть генерация случайного числа в програмном коде (или же вызов RAND() едиственный раз перед выполнением запроса), для определения id записи для выбора. Для избежания проблем, связанных с пустыми промежутками между id, то есть, с удаленными записями, можно использовать запрос вида: SELECT TOP 1 Title, text  FROM BlogPosts  WHERE ID >= @RandomValue  ORDER BY ID У данного подхода тоже есть недостатки (неравномерное распределение вероятностей). Да и запрос для получения N записей одним махом написать по-сложнее. Возможно вас заинтересует, довольно обширная статья по данному вопросу (на примере MySQL): http://jan.kneschke.de/projects/mysql/order-by-rand