Выбор произвольных сегментов Oracle

Я хотел бы выбрать следующий сегмент.

Random 5500 rows including the following segments:
       Subcategorie (sex): - 3300 men
                           - 2200 women
              Subcategorie (age): - 2140 between 18-34 years
                                  - 2100 between 35-54 years
                                  - 1260 between 55-99 years

Как я могу решить это в инструкции select?

Всего 1 ответ


Проблема в том, что вы используете слово «случайный», но у вас очень точный разбив когорт по возрасту и полу. Поистине случайный одиночный запрос не даст таких точных квот. Поэтому ваш запрос обязательно должен быть сложным: вам нужно разделить всю таблицу на подмножества, которые соответствуют вашим ограничениям, а затем случайным образом выбирают из этих подмножеств. Что-то вроде этого...

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).


Есть идеи?

10000