给定一个带有以下内容的表:
ID VALUE -- ----- 1 1 2 2 3 3 4 4
我想计算像这样的东西:
ID VALUE SUM -- ----- --- 1 1 40 -- (2-1)*2 + (3-1)*3 + (4-1)*4 + (5-1)*5 2 2 26 -- (3-2)*3 + (4-2)*4 + (5-2)*5 3 3 14 -- (4-3)*4 + (5-3)*5 4 4 5 -- (5-4)*5 5 5 0 -- 0
其中,每行的SUM是每个后续行的值的总和乘以后续行与当前行的值之差。
我可以从这样的东西开始:
CREATE TABLE x(id int, value int); INSERT INTO x VALUES(1, 1); INSERT INTO x VALUES(2, 2); INSERT INTO x VALUES(3, 3); INSERT INTO x VALUES(4, 4); INSERT INTO x VALUES(5, 5); SELECT id, value ,SUM(value) OVER(ORDER BY id ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) AS sum FROM x; id | value | sum ----+-------+----- 1 | 1 | 14 2 | 2 | 12 3 | 3 | 9 4 | 4 | 5 5 | 5 | (5 rows)
其中每一行具有所有后续行的总和。但是要进一步讲,我真的很想要类似下面的伪代码:
SELECT id, value ,SUM( (value - FIRST_ROW(value)) * value ) OVER(ORDER BY id ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) AS sum FROM x;
但这是无效的。这就是问题的症结所在:是否有一种方法可以引用分析函数窗口中的多行?还是采用其他方式来解决这个问题?上面的示例是人为设计的。
不太确定我是否在这里完全理解了您的要求,但是您想要的查询类似于
select a.id, a.value, sum(( b.value - a.value ) * b.value ) from x a, x b where a.id < b.id group by a.id, a.value
希望能有所帮助。