我有下表名为Temp。
S A B C D
1 10 6 0 6(因为它是第一行,我们将指定B值)
2 25 7 10 =((25 * 7)+(10 * 6))/(25 + 10)= 6.71
3 5 11 35 =((5 * 11)+(35 * 6.71))/(5 + 35)= 7.24
4 10 8 30 =((10 * 8)+(30 * 7.24))/(10 + 30)= 7.43
有人能告诉我如何在SQL中编写逻辑吗?从第二行你可以看到它正在使用第一行的结果。
答案 0 :(得分:2)
可能有更好的方法,但您可以使用递归CTE:
with recursive cte as (
select s, a, b, c, b as d
from t
where s = 1
union all
select t.s, s.a, t.b, t.c,
( (t.a*t.b) + (t.c*cte.d) ) / (t.a + t.c)
from cte join
t
on t.s = cte.s + 1
)
select *
from cte;
答案 1 :(得分:1)
递归查询是解决此类问题的自然方法。然而,递归并不是Postgres(和其他RDBMS)的强项。实际上,使用简单的迭代可以获得更好的性能,尤其是对于大型数据集。您需要一个函数来计算循环中的值:
create or replace function my_function()
returns table (s int, a int, b int, c int, d dec)
language plpgsql as $$
declare
rec record;
begin
for rec in
select * from temp order by s
loop
s:= rec.s;
a:= rec.a;
b:= rec.b;
c:= rec.c;
d:= case when rec.s = 1 then b
else ((a * b) + (c * d)) / (a + c) end;
return next;
end loop;
end $$;
select *
from my_function();
s | a | b | c | d
---+----+----+----+--------------------
1 | 10 | 6 | 0 | 6
2 | 25 | 7 | 10 | 6.7142857142857143
3 | 5 | 11 | 35 | 7.2500000000000000
4 | 10 | 8 | 30 | 7.4375000000000000
(4 rows)