我说'我有下表,其中percent_leave是上一期间离开当前时期的百分比:
| Period | percent_leave |
----------------------
| 1 | 0.05 |
| 2 | 0.05 |
| 3 | 0.05 |
| 4 | 0.05 |
我想计算一个新列,其中包含该期间结束时剩余人数的百分比。例如,如果我们从100个人开始,在第一个时期就有5个人离开,因此我们剩下95个。在第二个时期,95%的人将离开,留下90.25人,等等。然后表格如下:
| Period | percent_leave | percent_remaining
-----------------------------------------
| 1 | 0.05 | 0.95
| 2 | 0.05 | 0.9025
| 3 | 0.05 | 0.857375
| 4 | 0.05 | 0.81450625
如您所见,percent_remaining中新行的计算是指percent_remaining中的上一行。通常我会将这些原始数据导出到Excel中并在那里进行计算,但我想在SQL中自动执行此任务,因此我需要弄清楚如何在Postgres中执行此操作。
有什么想法吗?
答案 0 :(得分:5)
您可以使用累积金额执行此操作。 。 。和一些算术:
select t.*,
exp(sum(ln(1-percent_leave)) over (order by period))
from t;
这实际上是将product()
作为窗口函数实现的。这假定percent_leave
始终小于1且大于或等于0.
答案 1 :(得分:1)
您也可以使用pow
功能。
select period,percent_leave,pow((1-percent_leave),period) as percent_remaining
from t
如果期间值不是连续的,请使用row_number
作为pow
的第二个参数。
select period,percent_leave
,pow((1-percent_leave),row_number() over(order by period)) as percent_remaining
from t