2011-02-01 3 views
1

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

Я не заинтересован в использовании Netdeza's rand(), так как я хотел бы воспроизвести один и тот же образец позже, и я не рассчитываю на setseed().

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

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

где 3 числа простых чисел я порождающие моим собственным ГСЧ. Я на правильном пути? Является ли этот случайный выбор случайным?

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

Спасибо!

ответ

2

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

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

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

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

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

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

+0

+1 для хранения важных бизнес-данных в таблице. –

+1

Можете ли вы быть более явным? Скажем, у меня есть таблица действительно случайных чисел. Как использовать образец ** my ** table в равномерном дистрибутиве? присоединяюсь ли я к своему столу со случайным? – ihadanny

+0

Dillon - что-то, что еще не в моих силах: скажу, что я хотел бы запустить свою систему 10 раз, а позже смогу воспроизвести каждую из казней. В предложенном вами методе мне пришлось бы хранить 10 таблиц случайных чисел или 10 таблиц отношений, каждая из которых длиной в миллионы строк.В системе я предлагаю вам всего лишь зарегистрировать 10 операторов SQL, каждый из которых имеет свои 3 случайные простые числа, а воспроизведение просто запускает правильный SQL. Разве это не главный недостаток описанного вами метода? (** спасибо ** за ваше терпение) – ihadanny

Смежные вопросы