ウインドウ機能の「ウインドウフレーム」の部分が必要です。あなたはdocumentationで窓枠を確認することができます
select t.*,
sum(balance) over (order by period rows between 11 preceding and current row) as moving_sum_12
from t;
:移動12ヶ月の平均は次のようになります。
累積合計が必要な場合は、ウィンドウフレームを完全に省略することができます。
私はあなたにもlag()
を使用してこれを行うことができますことに注意しなければならないが、それははるかに複雑である:
select t.*,
(balance +
lag(balance, 1, 0) over (order by period) +
lag(balance, 2, 0) over (order by period) +
. . .
lag(balance, 11, 0) over (order by period) +
) as sum_1112
from t;
これは、レコード場合に使用するデフォルト値であるlag()
にほとんど知られていない第三引数を使用しています利用できません。それはcoalesce()
を置き換えます。
EDIT:あなたは12個の値が利用できないNULL
場合場合
、その後、case
とcount()
にも使用します。
select t.*,
(case when count(*) over (order by period rows between 11 preceding and current row) = 12
then sum(balance) over (order by period rows between 11 preceding and current row)
end) as moving_sum_12
from t;
あなたはおそらく(左(期間別のパーティション上の和を()したいです、 4)注文の順番) – scsimon
あなたは 'Sql Server'のどのバージョンを使用していますか? –
あなたは必ず毎月行を持っていますか、行が見つからないことがありますか? –