Выберите n случайных строк из таблицы SQL Server - PullRequest
284 голосов
/ 11 мая 2009

У меня есть таблица SQL Server, содержащая около 50 000 строк. Я хочу выбрать около 5000 из этих строк в случайном порядке. Я придумал сложный способ: создать временную таблицу со столбцом «случайное число», скопировать в нее свою таблицу, перебрать временную таблицу и обновить каждую строку с помощью RAND(), а затем выбрать из этой таблицы случайный номер столбца <0,1. Я ищу более простой способ сделать это, в одном выражении, если это возможно. </p>

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

Кто-нибудь когда-нибудь делал это раньше? Есть идеи?

Ответы [ 15 ]

2 голосов
/ 27 сентября 2011

Попробуйте это:

SELECT TOP 10 Field1, ..., FieldN
FROM Table1
ORDER BY NEWID()
0 голосов
/ 13 июня 2018

Используемый язык обработки на стороне сервера (например, PHP, .net и т. Д.) Не указан, но если это PHP, возьмите требуемое число (или все записи) и вместо рандомизации в запросе используйте случайное перемешивание PHP функция. Я не знаю, имеет ли .net эквивалентную функцию, но если она есть, используйте ее, если вы используете .net

ORDER BY RAND () может привести к значительному снижению производительности, в зависимости от количества задействованных записей.

0 голосов
/ 10 ноября 2017

Я использовал его в подзапросе, и он вернул мне те же строки в подзапросе

 SELECT  ID ,
            ( SELECT TOP 1
                        ImageURL
              FROM      SubTable 
              ORDER BY  NEWID()
            ) AS ImageURL,
            GETUTCDATE() ,
            1
    FROM    Mytable

тогда я решил с включением родительской табличной переменной, где

SELECT  ID ,
            ( SELECT TOP 1
                        ImageURL
              FROM      SubTable 
              Where Mytable.ID>0
              ORDER BY  NEWID()
            ) AS ImageURL,
            GETUTCDATE() ,
            1
    FROM    Mytable

Обратите внимание, где условие

0 голосов
/ 08 мая 2015

Похоже, newid () нельзя использовать в предложении where, поэтому для этого решения требуется внутренний запрос:

SELECT *
FROM (
    SELECT *, ABS(CHECKSUM(NEWID())) AS Rnd
    FROM MyTable
) vw
WHERE Rnd % 100 < 10        --10%
0 голосов
/ 10 декабря 2010

Это работает для меня:

SELECT * FROM table_name
ORDER BY RANDOM()
LIMIT [number]
...