QA@IT

SQLで、各グループの最新履歴の金額を合計する

4815 PV

SQL(SQLServer2014)についてご教示ください。
以下のようなテーブルがあるとします。

id  グループ  履歴   金額
-------------------------------------
1   A     1     100
2   B     1     2000
3   A     2     600
4   C     1     10000
5   A     3     400
6   B     2     4000

このテーブルに対してSQLを実行し、以下のような結果を得たいのですが
SQLの作成に手こずっており欲しい結果が得られていません。

id   結果
------------------
1    100  ←A(id:1)の金額
2    2100  ←A(id:1) + B(id:2)の金額
3    2600  ←A(id:3) + B(id:2)の金額
4    12600  ←A(id:3) + B(id:2) + C(id:4)の金額
5    12400  ←A(id:5) + B(id:2) + C(id:4)の金額
6    14400  ←A(id:5) + B(id:6) + C(id:4)の金額

「各行の自分のidより小さいidの範囲内で、各グループの最新履歴の金額を合計する」
というものなのですが、頭の中でSUMやらMAXやらWindow関数やらがごっちゃになってまとまりません。
どうかお力添えをお願いします

回答

自己レスですが、なんとか結果を得られました。
各グループの最新履歴の取得はMAXを使わず、履歴の逆順にRANKを振って1が最新になるように揃えました。
最善のSQLかどうかは分かりませんが、参考までに一応掲載しておきます。

SELECT 
A.*
,(
    SELECT SUM(B.money)
    FROM
    (
        SELECT C.id, C.grp, C.money,
               RANK() OVER (PARTITION BY C.grp ORDER BY C.history DESC) rnk
        FROM test C
        WHERE C.id <= A.id
    ) B
    WHERE B.rnk = 1
   ) 
FROM test A
ORDER BY id;
編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。