SQL:计算Postgres中引用其自己行的新列

时间:2017-03-24 19:51:54

标签: sql postgresql

我说'我有下表,其中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中执行此操作。

有什么想法吗?

2 个答案:

答案 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