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

Откуда:
Сообщений: 4
Добрый день.
Нужна помощь с запросом. Имеется определенная база с клиентами разбитыми на группы. Из нее надо вытащить Х записей, но соотношение групп должно быть как в исходной базе и в выборке должны присутствовать все группы.
Просится написать select * from table order by random() limin X, но мне кажется что это на совсем корректно

Сообщение было отредактировано: 4 июн 21, 20:24
4 июн 21, 20:30    [22331623]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на sql.Помогите.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53399
Задача в принципе не решаема если Х меньше количества групп. В противном случае SAMPLE кляуза спасёт ОРД.
5 июн 21, 13:59    [22331740]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на sql.Помогите.  [new]
DenchikJan
Member

Откуда:
Сообщений: 4
Dimitry Sibiryakov,
можно поподробнее немного? Количество групп сильно меньше Х
5 июн 21, 14:46    [22331747]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на sql.Помогите.  [new]
court
Member

Откуда:
Сообщений: 2335
DenchikJan,

вообще-то, как-то так
order by cast(row_number()over(partition by group_id order by (select 1)) as double) / count(*)over(partition by group_id) 
limit X

но это не гарантирует этого требования:
DenchikJan
выборке должны присутствовать все группы

например, есть 2-е группы, в 1-й 100 клиентов, во второй - 1 (т.е соотношение 1 к 100)
и Х=50
если "взять" запись из гр.2, то соотношение групп будет 1 к 49, что уже противоречит этому требования
DenchikJan
Из нее надо вытащить Х записей, но соотношение групп должно быть как в исходной базе
5 июн 21, 16:47    [22331778]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на sql.Помогите.  [new]
DenchikJan
Member

Откуда:
Сообщений: 4
court,
а можете объяснить решение? Я просто не очень понимаю.
5 июн 21, 17:34    [22331786]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на sql.Помогите.  [new]
Garya
Member

Откуда: Москва
Сообщений: 32365
Блог
Если число групп фиксированное и небольшое, допустим, их число N, то сначала делаете N запросов отдельно для каждой группы, выбирая в каждом из них X/N записей. Затем объединяете их по union, получаете N записей, в которых присутствуют все группы.
6 июн 21, 08:29    [22331851]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на sql.Помогите.  [new]
court
Member

Откуда:
Сообщений: 2335
Garya
делаете N запросов отдельно для каждой группы, выбирая в каждом из них X/N записей.
и получаете X/N записей в каждой группе ... и плевать на ТЗ с его "соотношение групп должно быть как в исходной базе" :)
6 июн 21, 12:33    [22331881]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на sql.Помогите.  [new]
court
Member

Откуда:
Сообщений: 2335
DenchikJan
court,
а можете объяснить решение? Я просто не очень понимаю.
выведи это значение
cast(row_number()over(partition by group_id order by (select 1)) as double) / count(*)over(partition by group_id) as xz

отдельным полем, с сортировкой по group_id, xz
"посмотри на него глазами" и сразу поймешь
6 июн 21, 12:37    [22331883]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на sql.Помогите.  [new]
DenchikJan
Member

Откуда:
Сообщений: 4
Я думал просто есть что то проще, я цикл написал. Для каждой группы определяю ее исходную долю и выделяю ее в Х. Так точно попадет каждая группа и будет сохранены пропорции.
Всем спасибо!
6 июн 21, 13:58    [22331903]     Ответить | Цитировать Сообщить модератору
Все форумы / Вопрос-Ответ Ответить