в красном смещении, как я могу использовать оконные функции для присвоения счетчика дате предыдущей строки

название было бы слишком многословным, если бы я действительно попытался втиснуть все это туда, но вот с чем мне нужна помощь ...

Мы пытаемся подсчитать удержание пользователей. У наших пользователей даты начала и окончания назначения могут совпадать. Что мне нужно сделать, так это просмотреть все назначения кандидатов и определить, сохраняются ли они (30 дней или меньше между предыдущим завершением и новым началом). Сложная часть: мне нужно присвоить удержание предыдущей дате окончания назначения. Вот предварительный просмотр данных:

month | user_id | start_date | end_date | rank | days_btw_assignment
    1     5       1-1-16      1-31-16     1       NULL
    2     5       2-14-16     4-15-16     2       15  
    6     4       6-01-16    11-01-16     1       NULL
    8     4       8-01-16    11-01-16     2       -81

Поэтому для пользователя 5 мне нужно было бы присвоить удержание месяцу 16 января, потому что дата окончания их назначения заканчивается 1–31–16. Для пользователя 4, где назначения перекрываются, я бы отдал кредит на удержание 16 ноября, потому что их предыдущая дата окончания назначения заканчивается 11.01.16.

Я ограничил этот пример случаями использования, когда у них есть только 2 назначения, хотя их может быть и больше. Мне просто нужен шаг в правильном направлении, и я, вероятно, смогу справиться со всеми другими вариантами использования самостоятельно.

Вот пример кода, который я использую сейчас:

with placement_facts as (select date_trunc('month',assignment_start_date) as month, user_id, assignment_start_date, assignment_end_date, rank () over (partition by user_id order by assignment_start_date asc), extract( day from assignment_start_date - lag(assignment_end_date, 1) over (partition by user_id order by assignment_start_date asc)) as time_btw_placement
from activations as ca
join offers on ca.offer_id = offers.id
where assignment_start_date != assignment_end_date
order by 2,4 asc)
select placement_facts.month, count(distinct case when time_btw_placement <=30 then user_id else null end) as retained_raw 
from placement_facts
group by 1;

Цените помощь и, пожалуйста, lmk, если мне нужно что-то уточнить!


person Kevin    schedule 15.02.2017    source источник
comment
Пожалуйста, поделитесь образцами данных и требуемыми выходными данными.   -  person sandeep rawat    schedule 16.02.2017


Ответы (1)


Если я понимаю ваш вопрос, я думаю, вы можете добиться желаемого, заменив использование LAG() на LEAD(). По сути, это та же функция, но она смотрит на заданное количество строк впереди.

person Joe Harris    schedule 16.02.2017