我正在尝试编写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月的客户保留表中。
将非常感谢您的帮助!谢谢。
答案 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;