【问题标题】:in redshift, how can I use window functions to assign a count to a previous row's date在红移中,如何使用窗口函数将计数分配给前一行的日期
【发布时间】:2017-02-15 22:17:16
【问题描述】:

如果我真的想把它全部塞进去,标题就太罗嗦了,但这是我需要帮助的地方......

我们正在尝试计算用户留存率。我们的用户的作业开始日期和作业结束日期可能重叠。我需要做的是查看所有候选作业并确定它们是否被保留(从上一个结束到新开始之间的 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;

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

【问题讨论】:

  • 请分享示例数据和所需的输出..

标签: sql amazon-redshift retention


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 2020-04-03
    • 1970-01-01
    • 2021-11-03
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 2022-09-24
    相关资源
    最近更新 更多