根据以上行结果查找每个数量的值

时间:2018-04-03 22:45:04

标签: sql postgresql math

我有下表名为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中编写逻辑吗?从第二行你可以看到它正在使用第一行的结果。

2 个答案:

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