Sql 跟踪红移中的客户损失

Sql 跟踪红移中的客户损失,sql,amazon-redshift,Sql,Amazon Redshift,我有一个这样的数据库。它有: 账户开立日期,或账户开立日期 账户关闭日,或账户关闭日 dayssinceopendt,如果acct\u close\u dt为空或 acct\u close\u dt-acct\u open\u dt如果acct\u close\u dt不为空 我想要的是: 对于从1990年1月1日到今天的一天序列,我想找出每天有多少活跃的客户 我最初的想法是 case when dateadd(day,dayssinceopenddt,acct_open_date) >

我有一个这样的数据库。它有:

账户开立日期
,或账户开立日期

账户关闭日,或账户关闭日

dayssinceopendt
,如果
acct\u close\u dt
为空或
acct\u close\u dt
-
acct\u open\u dt
如果
acct\u close\u dt
不为空

我想要的是:

对于从1990年1月1日到今天的一天序列,我想找出每天有多少活跃的客户

我最初的想法是

case when
dateadd(day,dayssinceopenddt,acct_open_date) > '1990-01-01'
then 1
else 0 end as here_on_19900101
对于所有的日子,然后总结每一个新的专栏,但这将是超级手动和超级低效

我怎样才能做得更好

(当然,我计划将课程从数字改为最新,您不必在回答中包含该内容。)

这可能就足够了:

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;
这将只返回数据中的日期,但这可能就足够了


请注意,在此逻辑中,结束日期不被视为活动日期。

!这是一种荣誉。考虑到在任何一天都至少有几千人加入,这非常有效。此外,对于任何未来的观众来说,第二条中的双倍总和需要第二个括号来包含dt的订单