我有一个看起来像这样的数据库。它具有:
acct_open_dt
,即开设帐户的日期。
acct_close_dt
,即帐户关闭的日期。
dayssinceopendt
,即今天-acct_open_dt
为acct_close_dt
为null或
acct_close_dt
-acct_open_dt
,如果acct_close_dt
不为空。
我想要什么:
对于1990年1月1日到今天的一天序列,我想查找每天有多少客户活跃。
我的初衷是做
case when
dateadd(day,dayssinceopenddt,acct_open_date) > '1990-01-01'
then 1
else 0 end as here_on_19900101
整天,然后对每个新列进行汇总,但这将是超级手动且效率低下的事情。
我该怎么做呢?
(当然,我计划将班级从数字更改为日期,您不必在答案中包括该类。)
答案 0 :(得分:1)
这可能就够了:
with t as (
select acct_open_dt, count(*) as ins, 0 as outs
from t
group by acct_open_dt
union all
select acct_close_dt, 0 as ins, count(*) as outs
from t
group by acct_close_dt
)
select dt,
(sum(sum(ins)) over (order by dt) -
sum(sum(outs)) over (order by dt)
) as actives_on_day
from t
group by dt;
这将仅返回数据中的日期,但这可能就足够了。
请注意,在此逻辑中,结束日期不被视为有效日期。