SQL如何从2个单独的列start_date和end_date中获得月度趋势?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL如何从2个单独的列start_date和end_date中获得月度趋势?相关的知识,希望对你有一定的参考价值。
想象我们有以下数据:
ID,State,start_date,end_date,Product
S1,Trial,2020/01/01,2020/01/07,Hulu
S1,Paid,2020/01/08,2020/01/31,Hulu
S1,Expired,2020/02/01,null,Hulu
S1,Paid,2020/03/01,2020/03/30,Hulu
S2,Paid,2020/01/08,2020/01/31,Hulu
S3,Paid,2020/01/09,2020/02/01,Hulu
create table test
(
ID varchar(10),
State varchar(10),
start_date datetime,
end_date datetime,
Product varchar(10)
);
insert into test
VALUES
('S1','Trial','2020-01-01','2020-01-07','Hulu'),
('S1','Paid','2020-01-08','2020-01-31','Hulu'),
('S1','Expired','2020-02-01',null,'Hulu'),
('S1','Paid','2020-03-01','2020-03-30','Hulu'),
('S2','Paid','2020-01-08','2020-01-31','Hulu'),
('S3','Paid','2020-01-09','2020-02-01','Hulu')
;
这里的问题是要获得2020年活跃付费订阅的每月趋势。对于每个订阅者(ID),我们只能计算他们活跃的月份。因此,对于S1,我们只能计算S1在2020年1月和2020年3月,而不是2020年2月处于活动状态。
在访问期间,我编写了一个函数,并说我们可以循环使用以在2020年的每个月调用此函数
def month_active_sub($yyyymm): select $yyyymm as month, count(distinct ID) from table where end_date >= $yyyymm and start_date <= $yyyymm and state='paid';
或
select '202001' as month, count(distinct ID) from table where end_date >= '202001' and start_date <= '202001' and state='paid' union all select '202002' as month, count(distinct ID) from table where end_date >= '202002' and start_date <= '202002' and state='paid' union all for another 10 months
我想知道是否有更好的方法编写此SQL查询?谢谢!
想象我们有以下数据:ID,州,开始日期,结束日期,产品S1,试用版,2020/01 / 01、2020 / 01/07,Hulu S1,已付款,2020/01 / 08、2020 / 01/31 ,Hulu S1,Expired,2020/02/01,null,Hulu S1,Paid,2020/03/01,...
答案
一种方法使用数字表:
以上是关于SQL如何从2个单独的列start_date和end_date中获得月度趋势?的主要内容,如果未能解决你的问题,请参考以下文章
如何将key,value作为spark sql中map的单独列