Как рассчитать статистически значимый размер выборки на основе общего количества записей? (Постгрес)

Допустим, я хочу получить случайную выборку клиентов, которые совершили покупку в определенном отделе в прошлом году.

Я хочу убедиться, что случайная выборка из каждого отдела является статистически значимой (используя формулу размера выборки) из общей совокупности клиентов, которые приобрели в отделе (если в отделе было 50 миллионов клиентов, которые сделали минимум 1 покупку , требуемый размер выборки составит около 390).

Я ищу что-то похожее на это: я бы закончил свой SQL-запрос ORDER BY random() LIMIT (подзапрос здесь, чтобы определить правильный размер выборки)

Как реализовать формулу размера выборки в подзапросе, из которого извлекается инструкция LIMIT BY?


person nz426    schedule 20.01.2019    source источник
comment
Постгрес или Редшифт? Хотя у них одинаковые корни, они не одинаковы   -  person a_horse_with_no_name    schedule 20.01.2019
comment
Ваши случайные данные оставляют меня ломать голову, потому что я не знаю ваших фактических данных... но для набора случайных данных просто закажите с помощью newid()   -  person Monofuse    schedule 20.01.2019
comment
Может быть, random() < XXX сделать такое, а не ORDER BY random() LIMIT .... XXX необходимо заменить на samplesize(SELECT COUNT(*) FROM T). Будет ли это иметь смысл?   -  person FXD    schedule 20.01.2019
comment
согласно первому комментарию, пожалуйста, удалите все следы красного смещения или postgres из вашего вопроса и тегов.   -  person Jon Scott    schedule 20.01.2019


Ответы (1)


Вы можете использовать оконные функции:

select t.*
from (select t.*,
             row_number() over (partition by department order by rand()) as seqnum,
             count(*) over (partition by department) as cnt
      from t
     ) t
where seqnum < <your formula based on department size here>;

Я не знаю, какая у вас формула для статистической значимости, но вы можете подключить ее, используя размер отдела (cnt), рассчитанный в подзапросе.

person Gordon Linoff    schedule 20.01.2019