首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个分析函数可以引用一个窗口中的多行吗?

一个分析函数可以引用一个窗口中的多行吗?
EN

Stack Overflow用户
提问于 2012-01-11 11:17:36
回答 1查看 140关注 0票数 2

给定一个包含以下内容的表:

代码语言:javascript
复制
    ID  VALUE
    --  -----
    1   1
    2   2
    3   3
    4   4

我想要计算如下:

代码语言:javascript
复制
    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 

其中每一行的总和是每一后续行的值的总和乘以后续行的值与当前行之间的差值。

我可以从下面的内容开始:

代码语言:javascript
复制
    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)

其中每一行具有所有后续行的总和。但更进一步,我真的想要像这样的伪代码:

代码语言:javascript
复制
    SELECT id, value
          ,SUM( (value - FIRST_ROW(value)) * value )
             OVER(ORDER BY id ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING) AS sum
      FROM x;

但这是无效的。这就是问题的症结所在:有没有一种方法可以在分析函数的窗口中引用多行?或者是一种不同的方法来解决这个问题?上面的例子是人为设计的。实际上,我是在玩另一个帖子Rollup Query中的一个有趣的拼图,这个拼图把我引向了这个问题。我在PostgreSQL9.1中尝试了这个,但没有绑定到那个。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-11 12:33:13

我不太确定我是否完全理解了您的需求,但是您想要的查询如下所示

代码语言:javascript
复制
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

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8813743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档