【问题标题】:Can multiple rows within a window be referenced by an analytic function?一个窗口中的多行可以被分析函数引用吗?
【发布时间】:2012-01-11 03:17:35
【问题描述】:

给定一张桌子:

    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;

但这是无效的。这就是问题的关键:有没有办法在分析函数的窗口中引用多行?或者另一种方法来解决这个问题?上面的例子是人为的。我实际上是在玩另一个帖子Rollup Query 中的一个有趣的谜题,这导致我遇到了这个问题。我正在 Postgresql 9.1 中尝试这个,但没有绑定到那个。

【问题讨论】:

    标签: sql postgresql window-functions


    【解决方案1】:

    不太确定我是否在这里完全理解了您的要求,但您想要的查询类似于

    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
    

    希望对您有所帮助。

    【讨论】:

    • 这很好。我认为你是对的,因为将涉及到自我加入。我不确定交叉产品部分。我今晚要拿这个再玩一会儿然后回来。谢谢。
    • 这对我帮助很大。只见树木不见森林。我用它来解决引用的问题。 (虽然我确实希望有一种方法可以在分析函数中引用多行,但它应该是可行的)。谢谢!
    猜你喜欢
    • 2021-04-21
    • 2023-03-12
    • 2018-03-23
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2018-07-01
    相关资源
    最近更新 更多