プラットフォームが再帰クエリをサポートしている場合(IIRCでは、MicrosoftのもののRECURSIVEキーワードを省略する必要があります)。CTEは「チェーン」の開始/終了を推定する必要があるため、残念ながら、タプルは何らかの方法で順序付けする必要があります(「行」フィールドを使用します。この目的には、内部タプルIDが最適です)。
WITH RECURSIVE sums AS (
-- Terminal part
SELECT d0.row
, d0.value AS value
, d0.value AS runsum
FROM data d0
WHERE NOT EXISTS (
SELECT * FROM data nx
WHERE nx.row < d0.row
)
UNION
-- Recursive part
SELECT t1.row AS row
, t1.value AS value
, t0.runsum + t1.value AS runsum
FROM data t1
, sums t0
WHERE t1.row > t0.row
AND NOT EXISTS (
SELECT * FROM data nx
WHERE nx.row > t0.row
AND nx.row < t1.row
)
)
SELECT * FROM sums
;
結果:
row | value | runsum
-----+-------+--------
1 | 3 | 3
2 | 7 | 10
3 | 1 | 11
4 | 2 | 13
(4 rows)