2

次のテーブルがあるとします。

    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;

しかし、これは有効ではありません。そして、それが問題の核心です: 分析関数のウィンドウで複数の行を参照する方法はありますか? または、これにアプローチする別の方法はありますか?上記の例は考案されたものです。私は実際に、この問題につながった別の投稿ロールアップ クエリの興味深いパズルで遊んでいました。私はPostgresql 9.1でこれを試していますが、それに縛られていません。

4

1 に答える 1

2

ここであなたの要件を正確に理解しているかどうかはよくわかりませんが、必要なクエリは次のようなものです

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

それが役立つことを願っています。

于 2012-01-11T04:33:13.203 に答える