有没有一种方法可以使用窗口函数(SQL)计算保留率

时间:2019-05-13 07:40:22

标签: sql amazon-redshift

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

我试图创建一个查询来使用窗口函数(amazon redshift)获取此数据,但是我找不到解决方法。

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)个函数,但我不知道该怎么做。 也许您有更好的解决方案来帮助我:)

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

1 个答案:

答案 0 :(得分:0)

  

我想找到所有在01/04/2019和01/25/2019之间订购的客户,并找到在他们第一次订购后的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来获得此类客户的数量。