我正在尝试用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;
请注意,性能不会很好。 我建议您升级到性能更高的数据库,尤其是支持窗口函数的数据库。