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中获得月度趋势?的主要内容,如果未能解决你的问题,请参考以下文章

组合来自 2 个单独的 SQL 表的列数据

SQL Server 日期查询,年月作为单独的列

如何将key,value作为spark sql中map的单独列

如何从 2 个不同的列进行 FTS 匹配

如果行中的初始值在 SQL 中为 < 或 > 0,如何返回单独的列总和

如何使用 dashDB 表中名为 _id 的列?