Выберите случайные строки в SQLite

в MySQL, вы можете выбрать X случайных строк со следующим заявлением:

SELECT * FROM table ORDER BY RAND() LIMIT X

это, однако, не работает в SQLite. Есть ли эквивалент?

4 ответов


гораздо улучшенная производительность использование:

SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x)

SQL-движки сначала загружают проецируемые поля строк в память, а затем сортируют их, здесь мы просто делаем случайную сортировку по полю id каждой строки, которая находится в памяти, потому что она индексируется, затем отделяем X из них и находим всю строку, используя эти X идентификаторы.

таким образом, это потребляет меньше ОЗУ и процессора по мере роста таблицы!


SELECT * FROM table ORDER BY RANDOM() LIMIT X


SELECT * FROM table ORDER BY RANDOM() LIMIT 1

все ответы здесь основан на ORDER BY. Это очень неэффективно (т. е. непригодного) для больших наборов, потому что вы будете оценивать RANDOM() для каждой записи, а затем ORDER BY что является дорогостоящей операцией ресурса.

другой подход-поставить abs(CAST(random() AS REAL))/9223372036854775808 < 0.5 на WHERE предложение, чтобы получить в этом случае, например, 0.5 шанс попадания.

SELECT *
FROM table
WHERE abs(CAST(random() AS REAL))/9223372036854775808 < 0.5

большое число-это максимальное абсолютное число, которое random() может произвести. The abs() потому что оно подписано. Результатом является равномерно распределенная случайная величина между 0 и 1.

это имеет свои недостатки. Вы не можете гарантировать результат, и если порог большой по сравнению с таблицей, выбранные данные будут смещены в сторону начала таблицы. Но в некоторых тщательно продуманных ситуациях это может быть осуществимым вариантом.