【发布时间】:2020-08-03 14:46:28
【问题描述】:
我的主要目标是快速了解用户在 30,90,180、180+ 天期间的平均收入。 我有一封电子邮件、他们加入某个群组的日期以及收入日期
create temporary table cohorts (
email varchar(64)
, start_date timestamp
, purchase_date timestamp
, amount decimal(10,2)
)
;
insert into cohorts
values
('johnsmith@domain.com', '2020-01-01 00:00:00', '2020-01-01 12:00:00', '200.00')
, ('happyday@domain.com', '2020-01-01 00:00:00', '2020-02-28 00:00:00','100.00')
, ('happyday@domain.com', '2020-01-01 00:00:00', '2020-01-28 00:00:00','100.00')
, ('susieq@domain.com', '2020-01-01 00:00:00', '2020-05-01 00:00:00', '50.00')
, ('janedoe@domain.com', '2020-01-01 00:00:00', '2020-03-30 00:00:00', '75.00')
, ('janedoe@domain.com', '2020-01-01 00:00:00', '2020-07-30 00:00:00', '75.00')
;
如果我想查看某个时间段内用户的平均收入,我会写如下内容:
select
case
when datediff(day,start_date, purchase_date) < 30 then 'Within 30'
when datediff(day,start_date, purchase_date) < 90 then 'Within 90'
when datediff(day,start_date, purchase_date) < 180 then 'Within 180'
else 'Older than 180'
end as cohort_flag
, count(distinct email) num_of_emails
, sum(amount) summed_amt
, sum(amount)/count(distinct email) as avg_value
from cohorts
group by 1
cohort_flag num_of_emails summed_amt avg_value
Within 30 2 300.0 150.0
Within 90 2 175.0 87.5
Within 180 1 50.0 50.0
Older than 180 1 75.0 75.0
但是,由于 case 语句解析为第一个 true 子句,因此它不包括来自早期“同类”的收入。我想要的结果如下,早期同类群组中的用户是其他群组的一部分:
cohort_flag num_of_emails summed_amt avg_value
Within 30 2 300.0 150.0
Within 90 3 475.0 158.33
Within 180 4 525.0 131.25
Older than 180 4 600.0 150.0
【问题讨论】:
标签: sql case amazon-redshift