在 PostgreSQL 中除以两个运行总计

问题描述 投票:0回答:1

我有三列,store_id、opening_date 和终止_date。

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

特定日期之前终止的商店总数 ÷ 该特定日期之前开业的商店总数

这将为我提供当时已关闭的已开业商店总数的比例。

我想计算从第一家商店开业到今天的每个日期的范围。

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

这是我到目前为止得到的代码

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

我一直在努力解决这个问题一段时间,谢谢你的帮助!

sql postgresql cumulative-sum
1个回答
1
投票

不要计算 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

© www.soinside.com 2019 - 2024. All rights reserved.