在 PostgreSQL 中将两个 运行 相加

Dividing two running totals in PostgreSQL

我有三列,store_id、opening_date 和 termination_date。

我想编写一个执行此操作的查询:

特定日期前关闭的商店总数 ÷ 同一特定日期前开业的商店总数

这会告诉我在该时间点已关闭的已开业商店总数的比例。

我想计算从第一家商店开业到现在的每个日期的跨度。

我已经意识到,为了做到这一点,我必须将两个 运行 总数相除(每家曾经终止的商店的 运行 总数 ÷ 每个商店的 运行 总数曾经开过的商店),这被证明是相当困难的。

注意:每家商店都有开业日期,但并非每家商店都有终止日期,因为此table中的大部分商店尚未终止

如果您无法理解我的意思,下面是查询图表的视觉效果:

这是我目前得到的代码

SELECT 
approved_time as opening_date, churn_date as termination_date, 
sum(count(id)) over (order by  churn_date asc rows between unbounded preceding and current row)  as terminated_stores,
sum(count(id)) over (order by  approved_time asc rows between unbounded preceding and current row) as total_stores,
sum(count(id)) over (order by  churn_date asc rows between unbounded preceding and current row) / 
sum(count(id)) over (order by  approved_time asc rows between unbounded preceding and current row) AS fraction_terminated

FROM STORES

GROUP BY churn_date,approved_date

结果 table 如下所示,其中 运行 商店总数仅为 1,2,3,4,5 ....(这不是 correct/what 我想要)并且结果分数也不正确。然而,终止商店的 运行 总和是正确的。

我一直在努力解决这个问题,感谢您的帮助!

不计算 ID。由于您不想将空值计为已终止,因此请改用日期列。您还需要指定首先排序空值:

sum(count(churn_date))
    over (order by churn_date nulls first
          range between unbounded preceding and current row
) * 1.00 as terminated_stores

您需要避免整数除法,因此在计算百分比之前将分子转换为十进制值。我更改为 range between 因此它将计算具有相同时间戳的所有商店打开(关闭)。你也必须避免被零除:

sum(count(close_dt)) over (
    order by close_dt asc nulls first
    range between unbounded preceding and current row
) * 1.00 /
nullif( sum(count(open_dt)) over (
    order by open_dt asc
    range between unbounded preceding and current row
), 0) as pct

在此处查看演示:http://sqlfiddle.com/#!17/48fa62/23