需要在日期期间计算行数,然后根据该日期期间使用其他条件计算行数

Posted

技术标签:

【中文标题】需要在日期期间计算行数,然后根据该日期期间使用其他条件计算行数【英文标题】:Need to count rows during a date period then count rows based on what that date period is using other conditions 【发布时间】:2016-12-12 21:36:50 【问题描述】:

我正在尝试计算订阅流失率。我有一个如下所示的表:

    subid  | startdate | enddate 
    000001 | 9/26/2016 | 10/26/2016
    000002 | 11/4/2015 | 12/4/2016 
    000003 | 11/18/2016| 12/18/2016 
    000004 | 8/3/2016  | 10/16/2016
    000005 | 7/16/2016 | 11/29/2016 

要按月计算流失率,我需要创建如下所示的逻辑:

select 
date_trunc('month',enddate) as month,
count(id), --of all accounts with an enddate of that month
count(id), --of all accounts that have a start date prior to that month and an end date equal to or after that month
from table1

这里的主要目标是找出在给定月份结束的订阅数量,并计算该月仍然有效的订阅数量。我不知道如何在同一组中执行此操作,因为第二个 count(id) 以第一个为条件。

示例表行的结果是这样的:

date      | count1 | count2
10/1/2016 | 2      | 4
11/1/2016 | 1      | 3
12/1/2016 | 2      | 3 

【问题讨论】:

使用条件聚合sum(case when ... then 1 else 0 end ) as cnt2 @xQbert 感谢您的想法,但由于该行的结束日期是 count(id) 而对 count2 而言,这将是实际与行无关的数据吗? 可能类似于 .. sum(case when startDate < date_trunc('month', current_date) and endDate>=date_trunc('month', endDate) - 1 then 1 else 0 end) 【参考方案1】:

您可以使用相关的子查询来获取不同的计数。

select distinct
date_trunc('month',enddate) as mnth,
(select count(*) from table1 
 where date_trunc('month',enddate) = date_trunc('month',t1.enddate)) count1,
(select count(*) from table1 
 where date_trunc('month',enddate) >= date_trunc('month',t1.enddate) 
 and date_trunc('month',startdate) <= date_trunc('month',t1.enddate)) count2 
from table1 t1
order by 1

另一种方法是自加入。

select 
date_trunc('month',t1.enddate) as mnth,
count(distinct t1.subid) c1,
count(distinct t2.subid) c2
from table1 t1
left join table1 t2 on date_trunc('month',t2.enddate)>= date_trunc('month',t1.enddate) and date_trunc('month',t2.startdate)<= date_trunc('month',t1.enddate)
group by date_trunc('month',t1.enddate)
order by 1 

Sample Demo

【讨论】:

以上是关于需要在日期期间计算行数,然后根据该日期期间使用其他条件计算行数的主要内容,如果未能解决你的问题,请参考以下文章

用C语言写一个函数,给出年月日,计算该日是该年的第几天

如何根据员工的月薪计算给定期间的工作日和薪酬?

C语言的问题:根据输入的年月日,输出该日为该年度的第几周、第几天、星期几。

合同终止日期是怎么算

如何根据公历计算Oracle SQL中一个期间的第一个日期和最后一个日期

检查多个接受期间的日期期间(例如许可期间与使用期间)