在 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
我有三列,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