在 FoxPro 中将前一行中的值相乘和相减,以获得新行



我正在尝试用fox pro编写命令,以帮助我计算表中的两个变量,

如下所示
age   death_rate   alive   dead
1      0.003       1000     3
2      0.001       997      1
3      0.0006
4      0.005
5      0.002
...

X岁时活着=(X-1岁时活着(-(X-1岁时死亡(

X岁死亡=(X岁death_rate(*(X岁活着(

我正在尝试自动计算活和死的其余值,但两个空列在计算中相互依赖,我不确定命令应该是什么样子

我不能给你一个命令来做到这一点,但如果你使用一个小程序,这相对容易。我不知道您使用的数据文件类型(VFP 表、MSSQL 表(,所以我将使用 VFP 光标进行演示。您可以通过在命令窗口中键入修改命令在 VFP 中打开新的程序窗口。将以下代码粘贴到"程序"窗口中,突出显示代码,右键单击并执行选择。

CREATE CURSOR deathrate (age i,death_rate n(6,4),alive i, dead i)
INSERT INTO deathrate (age,death_rate,alive,dead) VALUES (1,.003,1000,3)
INSERT INTO deathrate (age,death_rate,alive,dead) VALUES (2,.001,997,1)
INSERT INTO deathrate (age,death_rate,alive,dead) VALUES (3,.0006,0,0)
INSERT INTO deathrate (age,death_rate,alive,dead) VALUES (4,.005,0,0)
INSERT INTO deathrate (age,death_rate,alive,dead) VALUES (5,.002,0,0)
GOTO 2 && you have supplied the first 2 values, go to record 2
SCATTER NAME oprev  && create a scattered object of the current record, then...
SKIP    && skip 1 record
SCAN rest
replace alive WITH oprev.alive - oprev.dead, dead WITH round(death_rate * alive,0)
SCATTER NAME oprev    && refresh before skipping to next record
ENDSCAN
BROWSE NORMAL LAST

结果是:

AGE DEATH_RATE       ALIVE        DEAD
1     0.0030        1000           3
2     0.0010         997           1
3     0.0006         996           1
4     0.0050         995           5
5     0.0020         990           2

这在Foxpro中是相当痛苦的,因为它没有窗口功能。 您可以将累积sum()与日志和指数一起使用。 因此,要计算alive列:

select t.*,
(select coalesce(1000 * exp(sum(log(1.0 - deathrate)), 1000)
from t t2
where t2.age < t.age
) as alive
from t;

然后,您可以使用子查询来计算死数:

select t.*,
(alive * (1 - deathrate)) as dead
from (select t.*,
(select coalesce(1000 * exp(sum(log(1.0 - deathrate)), 1000)
from t t2
where t2.age < t.age
) as alive
from t
) t;

请注意,性能不会很好。 我建议您升级到性能更高的数据库,尤其是支持窗口函数的数据库。

相关内容

  • 没有找到相关文章

最新更新