Составить аналитический sql-запрос для определения эффективности рассылок
Необходимо оценить эффективность маркетинговых рассылок, упрощенная схема бд приведена на картинке. Считаем единичное уведомление эффективным, если в течение месяца после него клиент оформлял заказ. Эффективные уведомления маркируем единицей, неэффективные нулем (это все легко потом переводится в проценты с помощью ratio_to_report), построить можно, например, в разрезе интервалов между датой уведомления и датой заказа (например, посчитали статистику, и поняли, что на миллион sms 1% клиентов пришли в тот же день, 2% - на следующий, 1.5% - через 2 дня и т. д., а 90% вообще не пришло). Делаю это примерно следующим запросом (Redshift):
select min(datediff(day, o.date, n.date)), (100 * ratio_to_report(count(*)) OVER ()) :: numeric(6, 3)
from notifications n
left join orders o on n.client_id = o.client_id and datediff(day, o.date, n.date) between 0 and 30
group by datediff(day, o.date_created, n.date)
order by datediff(day, o.date_created, n.date)
Проблема здесь заключается в том, что если уведомлений, предшествующих заказу, было несколько, то неверно считать каждое из них эффективным. Я бы предложил "делить эффективность поровну", например, если
- был заказ 15 июня и уведомления 13 и 14 июня - делать вклады 0.5 в интервал 1 день и 0.5 в интервал 2 дня;
- были заказы 15 июня и 2 июля и уведомления 1 и 14 июня - делать вклады 0.5 в интервалы 14 дней и 1 день, и вклад 1 в интервал 18 дней.
Как составить такой запрос без цикла? У меня пока не получилось.
