私は PostgreSQL を使用しており、同じテーブルの 2 つのレコードを減算し、その結果を同じクエリで使用したいと考えています。
ここに表があります:
スコア
6
8
9
結果
6
2
1
私がしたいこと:
Result = Score(i) - Score(i-1)
最後に、これらの結果の合計が必要です。sum(result)
私の例では9でなければなりません。
私は PostgreSQL を使用しており、同じテーブルの 2 つのレコードを減算し、その結果を同じクエリで使用したいと考えています。
ここに表があります:
6
8
9
6
2
1
私がしたいこと:
Result = Score(i) - Score(i-1)
最後に、これらの結果の合計が必要です。sum(result)
私の例では9でなければなりません。
の行の順序を決定する何らかの方法が必要です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;
何かのようなもの
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
あなたのテーブルを置き換えると、あなたの例のようにデータを生成するだけの私の不思議を選択します。