2017-04-13 50 views
0
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 

我要计算任何aPostgres的查询的行递归操作

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

输出的每个b的区别:

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

是否有可能递归地在应用功能所有的表格行?

+2

你怎么能在预期的输出'了'多个值,当你使用'其中a = 1'在SQL查询? –

+0

也许一个子查询? –

+0

你能解释的更清楚,你需要什么? –

回答

2
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 
+1

作为纯粹的风格问题,我觉得这看起来吨与理智的空白,没有虚表更好:'SELECT f1.b - f2.b一个从Foo为F2 CROSS JOIN富为F2 WHERE f2.a = 1' –

2

可以使用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)