如何使用SQL生成客户保留表/同类群组分析

时间:2019-06-01 19:32:05

标签: sql presto

我正在尝试编写SQL查询(Presto SQL语法)以生成客户保留表(请参见下面的示例)。 一个月内至少进行一次交易的客户被视为该月的保留客户。

这是表格

user_id       transaction_date
bdcff651- .   2018-01-01
bdcff641 .     2018-03-15

这是我想要得到的结果

第一行应理解为: 在2018年1月的第一笔交易(定义为“ Jan激活队列”)的所有客户中,有35%随后在其首次交易日期后的一个月内进行了交易,下个月的23%,即15%下个月的百分比,依此类推。

  Date         1st Month   2nd Month       3rd Month

2018-01-01      35%               23% .         15%
2018-02-0       33 %             26% .         13%
2018-03-0       36%               27%           12%

例如,如果某人XYZ在2018年2月10日进行了第一笔交易,则其第一个月将是2018年2月11日至2018年3月10日,第二个月是2018年3月11日至2018年4月10日,依此类推。此人的详细信息需要显示在2018年2月的客户保留表中。

将非常感谢您的帮助!谢谢。

2 个答案:

答案 0 :(得分:1)

我对Presto不太熟悉,也没有测试Presto代码的方法。但是,经过一番搜索后,从SQL Server语法转换为Presto语法似乎并不难。这是我将在SQL Server中执行的操作,您应该可以将概念推广到Presto:

with transactions_info_per_user as (
select user_id, min(transaction_date) as first_transaction, 
       convert(datepart(year, min(transaction_date)) as varchar(4)) + convert(datepart(month, min(transaction_date)) as varchar(2)) as activation_cohort
from my_table
group by user_id
),

users_per_activation_cohort as (
select activation_cohort, count(*) as number_of_users
from transactions_info_per_user
group by activation_cohort
),

months_after_activation_per_purchase as (
select distinct mt.user_id, ti.activation_cohort, datediff(month, mt.transaction_date, ti.first_transaction) AS months_after_activation
from my_table mt
left join transactions_info_per_user as ti
on mt.user_id = ti.user_id
),

final as (
select activation_cohort, months_after_activation, count(*) as user_count_per_cohort_with_purchase_per_month_after_activation
from months_after_activation_per_purchase 
group by activation_cohort, months_after_activation
)

select activation_cohort, months_after_activation, 
       convert(user_count_per_cohort_with_purchase_per_month_after_activation as decimal(9,2)) / convert(users_per_activation_cohort as decimal(9,2)) * 100
from final

--Then pivot months_after_activation into columns 

我对事物的命名非常明确,因此您可以遵循思维过程。 Here是如何在Presto中进行透视的一个示例。希望这对您有帮助!

答案 1 :(得分:1)

您可以使用条件聚合。但是,我不确定您的实际计算是什么。

如果我仅使用date_diff()的内置定义,则逻辑如下:

select date_trunc(month, first_td) as yyyymm,
       count(distinct user_id) as cnt,
       (count(distinct case when date_diff(month, first_td, transaction_date) = 1
                            then user_id
                       end) /
        count(distinct user_id)
       ) as month_1_ratio,
       (count(distinct case when date_diff(month, first_td, transaction_date) = 2
                            then user_id
                       end) /
        count(distinct user_id)
       ) as month_2_ratio
from (select t.*,
             min(transaction_date) over (partition by user_id) as first_td
      from t
     ) t
group by date_trunc(month, first_td)
order by yyyymm;