SELECT record_date,
SUM(prc_amt) sum_prc_amt
FROM Accounts
GROUP BY record_date
図8 リスト6を実行して作られる中間テーブル
record_date
sum_prc_amt
2010-01-16
54,000
2010-01-17
130,000
2010-01-18
22,000
2010-01-19
-469,000
2010-01-20
-76,500
この結果にランキングをつければよいわけです。それでは、2つの軸に沿って考えましょう。
第一の軸(カット):どんなキーでこの結果をカットするべきか?
結果全体を一つのウィンドウとみなすため、カットは不要。したがってPARTITION BY句も不要
第二の軸(走査順序):どんなキーで走査するべきか?
もちろん、処理金額の合計の降順。つまりSUM(prc_amt)の降順
ここまでわかれば、問題は解けたも同然です。最終的な答えはリスト7のようになります。
ORDER BY句にSUM(prc_amt)という集約関数を指定しているのが見た目に違和感があるかもしれませんが、論理的にこれで正しいことは、もう読者のみなさんもおわかりでしょう。SELECT句に指定可能な項目ならば、OLAP関数のPARTITION BY句とORDER BY句のキーとして利用できるのです。
リスト7 処理日ごとの処理金額の合計でランキング
-- My SQL以外
SELECT record_date,
SUM(prc_amt) sum_prc_amt,
RANK() OVER (ORDER BY SUM (prc_amt) DESC) AS rank_sum
FROM Accounts
GROUP BY record_date;
-- My SQL
CREATE VIEW SumByDate (record_date, sum_prc_amt) AS
SELECT record_date,
SUM(prc_amt) sum_prc_amt
FROM Accounts
GROUP BY record_date;
なお、ここでORDER BY sum_prc_amtのように、SELECT句で指定した列の別名を指定したいと思うかもしれませんが、残念ながらこれは構文エラーとなって動きません。