Skip to content

累計(累積和)を計算する snippet

累計は、現在の行まで(その行を含めて)すべての行を合計します。古典的なウィンドウ関数の仕事で、自己結合もサブクエリも不要です。落とし穴はフレームに隠れています。OVER の中に ORDER BY を置くとデフォルトのフレームは RANGE UNBOUNDED PRECEDING になり、RANGE は同順位の行(同じソートキー)を1ステップとして扱います。つまり同点の行はすべて同じ累計を受け取ります。ROWS UNBOUNDED PRECEDING にすれば行ごとの蓄積になり、累計が意味するものはほとんど常にこちらです。ORDER BY を完全に省くと、代わりにすべての行に総合計が載ります。

累計は、現在の行まで(その行を含めて)すべての行を合計します。古典的なウィンドウ関数の仕事で、自己結合もサブクエリも不要です。落とし穴はフレームに隠れています。OVER の中に ORDER BY を置くとデフォルトのフレームは RANGE UNBOUNDED PRECEDING になり、RANGE は同順位の行(同じソートキー)を1ステップとして扱います。つまり同点の行はすべて同じ累計を受け取ります。ROWS UNBOUNDED PRECEDING にすれば行ごとの蓄積になり、累計が意味するものはほとんど常にこちらです。ORDER BY を完全に省くと、代わりにすべての行に総合計が載ります。

Runnable recipe · 1 languages
Files & Datasqlwindow-functionssumaggregatecumulative

Every language

1 languages, copy-ready. One at a time with syntax highlighting, or all inline.

SQLSQLrunnable
SELECT
    day,
    amount,
    SUM(amount) OVER (
        ORDER BY day
        ROWS UNBOUNDED PRECEDING
    ) AS running_total
FROM daily_sales
ORDER BY day;

Try it in the playground: add a duplicate day and watch the RANGE default give both rows the same total; ROWS fixes the accumulation. Moving 7-day window: ROWS BETWEEN 6 PRECEDING AND CURRENT ROW.

Run in the SQL playground →

Keep going

Read the sql-window-functions cheatsheet →