@immelnikoff
Изучаю БД

Как в Oracle или Teradata разбить все строки таблицы на N равновеликие СЛУЧАЙНЫЕ выборки?

Под случайной выборкой понимаю равномерное распределение элементов данной выборки по генеральной совокупности.
В Teradata можно получить случайную выборку размера k так:
SELECT *
FROM t1
SAMPLE RANDOMIZED ALLOCATION k;

Можно, конечно, продолжая дальше, из оставшихся строк сделать такую же выборку и т.д.
И если k = кол-во строк в таблице / N, то получим N равновеликих случайных семпла.
Но что-то уж слишком геморно. Мне кажется, должно существовать одно-двух строчное встроенное решение. Интересует как это сделать в Teradata.
Подскажите, пожалуйста.
  • Вопрос задан
  • 79 просмотров
Пригласить эксперта
Ответы на вопрос 2
select t1. *, ntile(N) over (order by dbms_random.random) nbatch  from t1

А дальше выбираете нужные части nbatch.
ntile в Oracle используется для построения гистограмм, поэтому +/- должен работать быстро.
Ответ написан
@alexalexes
Практически методом Монте-Карло помечаем числами из случайного интервала записи таблицы и берем интересуемую порцию по этой случайной метрике. Поскольку, рандом у нас по равномерному закону распределения работает, то и порцию данных вы получите примерно ожидаемой длины.
select *
from (
select t.*, dbms_random.value(0, 100) rnd
  from table t
) A
where A.rnd <= 30 -- выбираем примерно 30% случайных записей от ген. выборки
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы