【问题标题】:Is there a way to calculate retention rate with window function (sql)有没有办法用窗口函数(sql)计算保留率
【发布时间】:2019-05-21 18:31:10
【问题描述】:

我有一个名为“orders”的表,可以在其中找到“customer_id”和“order_date” 从 2019 年 1 月 4 日到 2019 年 1 月 25 日,我们修改了界面,希望看到对保留率的影响。 为了计算留存率,我想找出在 2019 年 1 月 4 日到 2019 年 1 月 25 日之间订购的所有客户,并找出他们在第一次订购后的 30 天内重新订购的客户数量。

我尝试使用窗口函数(亚马逊红移)创建查询以获取此数据,但我无法找到解决方案。

SELECT customer_id, FIRST_VALUE(order_date IGNORE NULLS) 
over (partition by customer_id order by order_date asc rows between unbounded preceding and unbounded following) AS first_order,
NTH_VALUE(order_date, 2)
over(partition by customer_id order by order_date desc
rows between unbounded preceding and unbounded following) AS second_order
FROM il_country_sg.v_fct_orders
WHERE order_date between '20190104' AND '20190226'
GROUP BY customer_id, order_date

这是我尝试做的。 我的问题是,当我使用 FIRST_VALUE 和 NTH_VALUE (2) 函数时,我得到了两个最新的日期。

我需要使用 LAST_VALUE 和 NTH_VALUE (n-1) 函数,但我不知道该怎么做。 也许你有更好的解决方案来帮助我:)

谢谢你,祝你有美好的一天!

【问题讨论】:

    标签: sql amazon-redshift


    【解决方案1】:

    我想查找在 2019 年 1 月 4 日至 2019 年 1 月 25 日之间订购的所有客户,并找出他们在首次订购后的 30 天内重新订购的客户数量。

    您可以使用lead()。像这样的逻辑应该会让您获得满足您问题条件的客户的第一笔订单:

    SELECT fo.*
    FROM (SELECT fo.*,
                 LEAD(fo.order_date) OVER (PARTITION BY fo.customer_id ORDER BY fo.order_date) as next_order_date,
                 ROW_NUMBER() OVER (PARTITION BY fo.customer_id ORDER BY fo.order_date) as seqnum
          FROM il_country_sg.v_fct_orders fo
          WHERE fo.order_date >= '20190104'
         ) fo
    WHERE order_date < '20190226' AND
          seqnum = 1 AND
          DATEDIFF(day, orderdate, next_order_date) <= 30;
    

    您可以使用子查询或 CTE 来获取此类客户的数量。

    【讨论】:

    • 谢谢! LEAD() 函数实际上非常有用,谢谢!我试图运行查询,但失败了。这是我的错误消息:[Amazon](500310) 无效操作:“)”处或附近的语法错误。它指的是“)”这里WHERE fo.order_date BETWEEN '20190104' ) fo。请问您知道如何解决吗?
    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多