Задача довольно амбициозная.У меня около 50 тыс. Пользователей в месяц, и я хочу сопоставить аналогично распределенную группу контроля размера из полного пула пользователей, который составляет около 50 млн. Пользователей.Чтобы получить аналогичное распределение, у меня есть некоторые категориальные и числовые особенности.Категориальные черты будут просто inner joined
.Числовые характеристики хотели бы округлить, но это составляет самую большую проблему.
Вот мой код:
with pl_subs as( -- in the cte I
select al.*
,ROW_NUMBER() OVER(PARTITION BY
al.device_type
,al.report_mnth
,round(al.days_to_LAST_FLASH_DTTM, -1)
,round(al.LT_month, -1)
,round(al.REVC, -1)
,round(al.usg_in, -2)
,round(al.usg_AC, -1)
ORDER BY null) AS RN
from ai_pl_SUBS test_gr
inner join ai_SUBS_MONTH_CLR al
on al.cust_id = test_gr.cust_id
and al.report_mnth = test_gr.REGISTERED_mnth
where al.report_mnth = '2017-11' and test_gr.REGISTERED_mnth = '2017-11'
)
sel count(1) -- just to count from (
sel al.cust_id, pl_subs.rn rn_pl
,ROW_NUMBER() OVER(PARTITION BY
pl_subs.device_type
,pl_subs.report_mnth
,pl_subs.MCID
,round(pl_subs.days_to_LF, -1)
,round(pl_subs.LT_month, -1)
,round(pl_subs.REVC, -1)
,round(pl_subs.usg_in, -2)
,round(pl_subs.usg_AC, -1)
ORDER BY null) AS RN
from pl_subs
inner join ai_SUBS_MONTH_CLR al on
-- 2 categorilal features
pl_subs.device_type = al.device_type
and pl_subs.report_mnth = al.report_mnth
-- 5 numerical features
and round(pl_subs.days_to_LF, -1) = Round(al.days_to_LF, -1)
and round(pl_subs.LT_month, -1) = Round(al.LT_month, -1)
and round(pl_subs.REVC, -1) = Round(al.REVC, -1)
and round(pl_subs.usg_in, -2) = Round(al.usg_in, -2)
and round(pl_subs.usg_AC, -1) = Round(al.usg_AC, -1)
-- in the control group shouldnot be any cust_id from the test group
where al.cust_id not in (select cust_id from ai_pl_SUBS)
and al.report_mnth = '2017-11'
) _out where rn <= rn_pl
-- each 7 features determines strata. So I need to have so many cust as I have in appropriate strata in the test group
Люди в тестовой группе имеют более высокие числовые значения.В приведенном выше коде я округляю до десятков, поэтому промежуточная шпуля не будет слишком большой, но в результате я получаю только 36 тыс. Пользователей, а не 50 тыс., Как ожидалось.Я округляю до 2 - запрос не удастся с проблемой буферизации
Аналогично распределено - имеют одинаковое среднее значение для числовых значений
Есть ли ошибки кода?Как можно изменить код, чтобы клиент включался в страту несколько раз?