SQL 递归跟踪购买月份的查询

SQL Query to recursively track month of purchase

我有一个 table,其中包含客户 ID 和购买月份。对于每个客户,我首先需要在他们购买的第一个月对他们进行细分,即,如果客户在 2017 年 6 月 10 日进行了第一次购买,那么他们属于 2017 年 6 月的时段。请参见下面的示例数据 table。

然后对于该客户的每次后续购买(比如从 2​​017 年 6 月开始),我们需要跟踪月份。例如,如果 2017 年 6 月的客户在 2017 年 6 月 25 日进行了第二次购买,并在 2017 年 8 月 11 日进行了第三次购买。那么第二次购买将计入第 1 个月(第一次交易后 30 天内),第 3 次购买将计入第 3 个月,因为 2017 年 8 月 11 日和 2017 年 6 月 10 日之间相差 62 天,介于 61 和 90 天之间,因此在第 3 个月。

请参阅下面的示例输出 table,尽管我需要以百分比形式显示(第一个月、第二个月等的客户百分比)。在 table 中,我们显示了在 2017 年 1 月进行了首次交易的所有客户,以及随后几个月进行交易的客户数量。

需要对每个客户进行此跟踪。虽然我相信我对第一部分感到满意​​,但我需要对每个客户进行细分,但我可以根据第一部分或分区来做到这一点。

我不确定如何为后续交易递归执行此操作。

在此先感谢您的帮助!

您可以使用滞后功能创建一个列“以前的购买。

Lag(purchasemonth,1) over(partition. by customerid order by purchasemonth) as [PreviousPurchaseDate]

然后根据需要简单地做一个 datediff 和 bucket。

您只需使用window函数定义原始月份,然后进行条件聚合。

你没有提到数据库,但就是这个想法:

select to_char(first_purchase_date, 'YYYY-MM') as yyyymm,
       sum(case when months_between(first_purchase_date, purchase_date) = 1 then 1 else 0 end) as purchases_1,
       sum(case when months_between(first_purchase_date, purchase_date) = 1 then 1 else 0 end) as purchases_2,
       . . .
from (select t.*,
             min(purchase_date) over (partition by customer_id) as first_purchase_date
      from t
     ) t
group by first_purchase_date;

我发明了 months_between()to_char() 函数,但你应该明白了。

以上曲目 购买 。要获取客户,您可以使用:

       (count(distinct case when months_between(first_purchase_date, purchase_date) = 1 then customer_id) /
        count(distinct customer_id)
       ) as month_1_ratio