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,我需要将保留归功于 1 月 16 日,因为他们的任务结束日期是 16 年 1 月 31 日。对于有作业重叠的用户 4,我会将保留归功于 nov-16',因为他们之前的作业结束日期是 16 年 1 月 1 日。

我已将此示例限制为只有 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;

感谢您的帮助,如果我需要澄清任何事情,请联系我!

4

1 回答 1

0

如果我理解您的问题,那么我认为您可以通过将使用替换LAG()LEAD(). 它基本上是相同的功能,但它查看给定数量的行

于 2017-02-16T20:01:48.653 回答