Проблема в том, что вы используете слово «случайный», но у вас очень точное распределение когорт по возрасту и полу.По-настоящему случайный одиночный запрос не даст таких точных квот.Поэтому ваш запрос обязательно должен быть сложным: вам нужно разделить всю таблицу на подмножества, которые соответствуют вашим ограничениям, а затем случайным образом выбрать из этих подмножеств.Примерно так ...
select * from (
select * from whatever
where sex = 'M'
and age between 18 and 34
order by dbms_random.value
)
where rownum <= 1284
union all
select * from (
select * from whatever
where sex = 'M'
and age between 35 and 54
order by dbms_random.value
)
where rownum <= 1260
union all select * from (
select * from whatever
where sex = 'M'
and age between 55 and 99
order by dbms_random.value
)
where rownum <= 756
union all
select * from (
select * from whatever
where sex = 'F'
and age between 18 and 34
order by dbms_random.value
)
where rownum <= 856
union all
select * from (
select * from whatever
where sex = 'F'
and age between 35 and 54
order by dbms_random.value
)
where rownum <= 840
union all select * from (
select * from whatever
where sex = 'F'
and age between 55 and 99
order by dbms_random.value
)
where rownum <= 504
Это может плохо работать, в зависимости от обычных факторов - размера таблицы, индексации и т. Д. - но это даст именно эти когорты.
В случае, если это не очевидно, границы rownum
- это число посещений в каждой возрастной группе, умноженное на соотношение мужчин и женщин (3: 2).