在Redshift上使用start_date和end_date进行累积打开订阅

时间:2017-09-06 12:34:32

标签: sql amazon-redshift

我正在尝试编写一个查询,允许我在Redshift中按天计算有效订阅的数量。

我有下表:

  sub_id   | start_date |  end_date
  ---------------------------------------
   20001   | 2017-09-01 |   NULL
   20002   | 2017-08-01 | 2017-08-29
   20003   | 2016-01-01 | 2017-04-25
   20004   | 2016-07-01 | 2017-09-03

我希望能够说明,对于两个日期之间的每个日期,有多少订阅处于活动状态,这样:

      date    | active_subs
  ------------------------
  2016-06-30  |  1
  2016-07-01  |  2
    ...       |
  2017-04-24  |  2
  2017-04-25  |  1
    ...       |
  2017-07-31  |  1
  2017-08-01  |  2
    ...       |
  2017-08-28  |  2
  2017-08-29  |  1
  2017-08-30  |  1
  2017-08-31  |  1
  2017-09-01  |  2
  2017-09-02  |  2
  2017-09-03  |  1

我有一个参考表,查询可以从中每天绘制1行,表名为date,相关列为date.ref_date(采用YYYY-MM-DD格式)

我是否使用窗口函数编写此查询,还是有更好的方法?

由于

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你不需要窗口函数,连接(日期表除外)或累积计数。你可以这样做:

SELECT t.date,
       COUNT(s.sub_id) as active_subs
FROM dateTable t
LEFT JOIN YourTable s
 ON(t.dateCol between s.start_date 
              AND COALESCE(s.end_date,<Put A late date here>))
GROUP BY t.date

答案 1 :(得分:1)

我会这样做:

with cte as (
      select start_date as dte, 1 as inc
      from t
      union all
      select coalesce(end_date, current_date), -1 as inc
      from t
     )
select dte,
       sum(sum(inc)) over (order by dte)
from cte
group by dte
order by dte;

可能存在一个一个错误,具体取决于您是在第二天或第二天计算停止时间。