2

私は PostgreSQL を使用しており、同じテーブルの 2 つのレコードを減算し、その結果を同じクエリで使用したいと考えています。

ここに表があります:

スコア

6
8
9


結果

6
2
1

私がしたいこと:

Result = Score(i) - Score(i-1)

最後に、これらの結果の合計が必要です。sum(result)私の例では9でなければなりません。

4

2 に答える 2

5

の行の順序を決定する何らかの方法が必要ですscore。リレーショナル データベースのテーブルには「自然な順序」はありません。したがってid、レコードを注文するための(またはタイムスタンプなど)があると思います。またはi、新しい行ごとに大きくなることが保証されていますか? その後、 で注文できますi

クエリ自体は単純です。ウィンドウ関数について知ったら、次のようにします。

SELECT i - lag(i, 1, 0) OVER (ORDER BY id) AS result
FROM   score
ORDER  BY id;

@Clodoaldoによる改善を含みます(コメントを参照)。

lag(i, 1, 0) OVER (ORDER BY id)

以下と同等ですが、より洗練されています。

COALESCE(lag(i) OVER (ORDER BY id), 0)

目的は、前の行がない最初の行の特殊なケースをカバーすることです。
sqlfiddle のデモ。

sum(result)iあなたの説明によれば、それは最後に等しいことにバインドされているため、簡単です:

SELECT i
FROM   score
ORDER  BY id DESC
LIMIT  1;
于 2012-06-22T13:06:28.847 に答える
0

何かのようなもの

SELECT SUM(COALESCE(rx.diff,rx.val))
  FROM
(SELECT x.val,
        x.val - lag(x.val) over () as diff
  FROM (SELECT unnest(ARRAY[6,8,9]) as val) AS x) AS rx

あなたのテーブルを置き換えると、あなたの例のようにデータを生成するだけの私の不思議を選択します。

于 2012-06-22T10:43:00.630 に答える