Повторяемая случайная выборка SQL - PullRequest
1 голос
/ 01 февраля 2011

Мне нужен обзор для моего решения для выборки 100 случайных строк из таблицы, хранящейся на машине MPP (в настоящее время Netezza, позже может быть hadoop / etc.)

Меня не интересует использование ранда Netezza(), так как я хотел бы иметь возможность воспроизвести тот же образец позже, и я не рассчитываю на setseed ().

Решение, которое я использую сейчас:

SELECT * FROM MY_TABLE ORDER BY ID % 371, ID % 17, ID % 501, ID LIMIT 100

где 3 числа являются простыми числами, которые я генерирую собственным RNG.Я на правильном пути? Является ли этот "случайный" образец достаточно случайным?

ПРИМЕЧАНИЕ. Мне не нужно, чтобы это был крипто-сильный случайный образец, я просто хочу убедиться, что выбираю другой образецкаждый раз, и сэмплирование равномерно, и я хотел бы легко иметь возможность воспроизводить мой сэмпл (выполняя тот же SQL) при необходимости.

Спасибо!

1 Ответ

2 голосов
/ 01 февраля 2011

Я бы не пытался генерировать случайные числа в SQL, когда так легко получить некоторые реальные случайные числа, вставить их в таблицу или в вашу хранимую процедуру.

Перейти к https://www.fourmilab.ch/hotbits/secure_generate.htmlчтобы получить 256 случайных битов в шестнадцатеричном формате, сгруппируйте цифры по 4 за раз, преобразуйте в десятичные целые числа и затем используйте первые 100 чисел в качестве ключей.

У вас будет повторяемая последовательность, и вы можете сделать столько истинныхслучайные последовательности по мере необходимости.

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

Что касается использования SQL, если вы правильно структурируете свою БД, это просто.В этом случае, поскольку я строю случайную таблицу один раз и использую ее для запросов более одного раза, я бы создал таблицу, содержащую первичные ключи, а не только генерируемые случайные числа.Или, если бы я собирался повторить это с разными наборами чисел, я бы построил таблицу отношений (как в моделировании ER), которая связывает таблицу случайных чисел с таблицей, которую я выбираю.Я не навязываю все в SQL, но сгенерирую таблицу случайных чисел и построю таблицу отношений, используя язык сценариев.

В приведенном выше примере вам нужно 100 выборок, поэтому таблица случайных выборок будет содержать 100 первичныхключи выбираются внешним скриптом.Каждый раз, когда вы запускаете выборку, вы получаете одни и те же записи, пока не измените таблицу случайной выборки.Чтобы изменить таблицу, создайте дамп первичных ключей таблицы, которую вы хотите отобрать, затем запустите сценарий для случайного выбора 100, сгенерировав 100 чисел от 1 до общего числа первичных ключей.Если вы используете такой инструмент, как Python, вы можете получить однородные случайные числа, гамма-распределение, гауссову, нормаль логарифма, парето и другие.

...