我正在尝试编写一个查询,允许我在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格式)
我是否使用窗口函数编写此查询,还是有更好的方法?
由于
答案 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;
可能存在一个一个错误,具体取决于您是在第二天或第二天计算停止时间。