繁体   English   中英

Postgres查询行上的递归操作

[英]Postgres query for recursive operation on rows

create table foo (a int, b float);

insert into foo values (1, 2), (2,3),(3,2.5),(4,1.5);

 a |  b  
---+-----
 1 |   2
 2 |   3
 3 | 2.5
 4 | 1.5

我想计算任何a的每个b的差

select RECURSIVE diff (?,?) on b where a=1

OUTPUT:

 a |  diff  
---+-----
 1 |   0
 2 |   1
 3 | .5
 4 | -.5

是否可以在所有表​​行上递归应用函数?

您可以使用LAG窗口函数获取行之间的差异:

SELECT b - LAG(b) OVER (ORDER BY a ASC) 
FROM foo;
┌──────────┐
│ ?column? │
├──────────┤
│   (null) │
│        1 │
│     -0.5 │
│       -1 │
└──────────┘
(4 rows)

然后,您可以SUM

SELECT SUM(d) OVER (ORDER BY a ASC)
FROM (
    SELECT a, b - LAG(b) OVER (ORDER BY a ASC)
    FROM foo
) sub(a, d);
┌────────┐
│  sum   │
├────────┤
│ (null) │
│      1 │
│    0.5 │
│   -0.5 │
└────────┘
(4 rows)
select b - b0
from
    foo
    cross join
    (select b as b0 from foo where a = 1) s
;
 ?column? 
----------
        0
        1
      0.5
     -0.5

由于注释中有成千上万的请求,因此这是一个优雅的版本:

select f1.b - f2.b
from
    foo f1
    cross join
    foo f2
where f2.a = 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM