有没有办法查询 table 引用以前期间的结果列?
Is there a way to query a table referencing the result column for prior periods?
问题
我想针对每个 ID 使用当前时间段计算中之前所有时间段的汇总结果执行查询。
我想出的解决方案是每个时间段单独做,但随着时间段数量的变化,这是有问题的。
有没有一种方法可以使用不需要对每个时间段的结果集进行硬编码的通用方法来查询?
数学
对于数据中的每个 ID,计算如下
在时间段 0 中,聚合应为零,方程式为:
时间段 1 应该是:
为了展示目标,我将跳转到时间段 3:
对于 ID1 和时间段 3,结果将是:
如以下数据中的 WANT 列所示
数据
我的数据是ID、T、B、P和A。WANT是预期的结果,应该与等式中的R匹配
ID
T
B
P
一个
想要
ID1
0
25
0
75
0,0000
ID1
1
25
5
70
1,7857
ID1
2
20
8
67
2,6013
ID1
3
15
32
43
14,4275
ID2
0
25
0
75
0,0000
ID2
1
20
5
70
1,4286
ID2
2
17
8
67
2,2004
ID2
3
10
32
43
10,1425
ID3
0
25
0
75
0,0000
ID3
1
25
5
70
1,7857
ID3
2
25
8
67
3,1983
ID3
3
5
32
43
7,4300
示例数据
现在使用 gsalem 提供的解决方案:
sqlfiddle
在你的 dbfiddle 中试试这个:
with get_rates (id, t, b, p, a, prt, w) as
(select id, t, b, p,a, 0 prt, (0+b)*p/A w
from data
where T=0
union all
select a.id, a.t, b.b,b.p, b.a, b.prt+w,(b.prt+b.w+a.b)*a.p/a.a
from data a join get_rates b on (a.id=b.id and a.t=b.t+1))
select id,t,b,p,a,w
from get_rates
order by id,t
问题
我想针对每个 ID 使用当前时间段计算中之前所有时间段的汇总结果执行查询。
我想出的解决方案是每个时间段单独做,但随着时间段数量的变化,这是有问题的。
有没有一种方法可以使用不需要对每个时间段的结果集进行硬编码的通用方法来查询?
数学
对于数据中的每个 ID,计算如下
在时间段 0 中,聚合应为零,方程式为:
时间段 1 应该是:
为了展示目标,我将跳转到时间段 3:
对于 ID1 和时间段 3,结果将是:
如以下数据中的 WANT 列所示
数据
我的数据是ID、T、B、P和A。WANT是预期的结果,应该与等式中的R匹配
ID | T | B | P | 一个 | 想要 |
---|---|---|---|---|---|
ID1 | 0 | 25 | 0 | 75 | 0,0000 |
ID1 | 1 | 25 | 5 | 70 | 1,7857 |
ID1 | 2 | 20 | 8 | 67 | 2,6013 |
ID1 | 3 | 15 | 32 | 43 | 14,4275 |
ID2 | 0 | 25 | 0 | 75 | 0,0000 |
ID2 | 1 | 20 | 5 | 70 | 1,4286 |
ID2 | 2 | 17 | 8 | 67 | 2,2004 |
ID2 | 3 | 10 | 32 | 43 | 10,1425 |
ID3 | 0 | 25 | 0 | 75 | 0,0000 |
ID3 | 1 | 25 | 5 | 70 | 1,7857 |
ID3 | 2 | 25 | 8 | 67 | 3,1983 |
ID3 | 3 | 5 | 32 | 43 | 7,4300 |
示例数据
现在使用 gsalem 提供的解决方案: sqlfiddle
在你的 dbfiddle 中试试这个:
with get_rates (id, t, b, p, a, prt, w) as
(select id, t, b, p,a, 0 prt, (0+b)*p/A w
from data
where T=0
union all
select a.id, a.t, b.b,b.p, b.a, b.prt+w,(b.prt+b.w+a.b)*a.p/a.a
from data a join get_rates b on (a.id=b.id and a.t=b.t+1))
select id,t,b,p,a,w
from get_rates
order by id,t