2017-02-15 7 views
0

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

Мы пытаемся рассчитать сохранение пользователей. Наши пользователи имеют даты начала и даты назначения, которые могут перекрываться. Мне нужно посмотреть все кандидаты и определить, сохранены ли они (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, я должен был бы отдать удержания в месяц JAN-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; 

Цените помощь и, пожалуйста, ЛМК, если я урожденная уточнить что-нибудь!

+0

Пожалуйста, поделитесь данными образца и требуемым выходом. –

ответ

0

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