Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / SQLite Новый топик    Ответить
 Запрос на N-кратную блочную выборку из случайной позиции таблицы  [new]
Познающий
Member

Откуда:
Сообщений: 62
Приветствую!

Есть необходимость за один запрос получать 1/3/10... т.е. "N" блоков по 10/25/32/... т.е. "X" записей в каждом блоке.
В виде одной итоговой выборки с кол-вом строк N*X. Столбцами выступают уникальные данные. К примеру пусть их два.
При следующих доп.условиях: параметры N и X задаются в теле запроса/биндятся для внешнего API.
Внутри блоков записи идут в сортировке, заданной параметром order BY .....
Их кол-во "подряд" - и есть первый входной параметр запроса.
Еще параметром для этих блоков являются вшитые пара условий вида where param1 is null and param2 = 12.
Эти блоки должны выбираться случайным образом. Т.е. если надо найти 3 блока по 5 записей, то, к примеру, первый блок выбирается с первой записи в таблице и по пятую. Второй блок - с 118 и по 123. Третий блок с 21 записи и по 26.
И всего в итоговой таблице/выборке мы видим 3*5=15 записей.
Т.е. очередность выборки блоков - величина случайная!
НО блоки не должны пересекаться! Т.е. всегда очередной блок К должен содержать "X" записей, которые НЕ участвовали в блоках с 1 по К-1 шаг. Т.е. все 15 примерных записей из примера выше - уникальны! Равно как и в самой таблице эти поля уникальны.

Кто как видит решение кроме как "в лоб" - когда N раз повторяем запрос с главной частью -
LIMIT X OFFSET abs(random() % (select count(*) from TABLE));

Просто в этом случае на I-ом повторе (I<=N) может случайно (нам же стартовую позицию блока=OFFSET надо случайно выбирать) выйти так, что часть записей этого блока (или даже весь он) окажутся равны уже ранее выбранным записям прежнего блока из предыдущего шага К=[1; I). Т.е. нарушаем правило: "блоки не должны пересекаться!"
8 апр 19, 13:38    [21855870]     Ответить | Цитировать Сообщить модератору
Все форумы / SQLite Ответить