OLAP専用関数
では次に,
ROW_ | レコードに一意な連番を振る |
RANK | レコードのランキングを算出する。同位のレコードが複数存在する場合は, |
DENSE_ | 基本的にRANKと同じだが, |
これらOLAP専用の関数は,
構文は先ほど説明したものとまったく同じですが,
では,
- 第一の軸
(カット) :どんなキーでこの結果をカットするべきか? - 口座ごとにカットするので,
account_ id - 第二の軸
(走査順序) :どんなキーで走査するべきか? - 入金の多い順なので,
処理金額の降順。つまりprc_ amtの降順
従って,
リスト3 入金の多い日の順番で,
-- My SQL以外
SELECT account_id,
record_date,
prc_amt,
RANK() OVER (PARTITION BY account_id
ORDER BY prc_amt DESC) AS rank_amt
FROM Accounts;
-- My SQL
SELECT account_id,
record_date,
prc_amt,
(SELECT COUNT(*)
FROM Accounts A2
WHERE A1.account_id = A2.account_id
AND A1.prc_amt <= A2.prc_amt ) AS rank_amt
FROM Accounts A1;
図4 リスト3の実行結果
account_id record_date prc_amt rank_amt ---------- ----------- ------- -------- A 2010-01-20 23,000 1 A 2010-01-17 20,000 2 A 2010-01-16 1,000 3 A 2010-01-18 -3,000 4 A 2010-01-19 -500,000 5 B 2010-01-17 98,000 1 B 2010-01-16 48,000 2 B 2010-01-19 30,000 3 B 2010-01-18 -5,000 4 B 2010-01-20 -100,000 5 C 2010-01-18 30,000 1 C 2010-01-17 12,000 2 C 2010-01-16 5,000 3 C 2010-01-19 1,000 4 C 2010-01-20 500 5
注意点は,
正確には,
- OLAP関数のルール 3
- OLAP専用関数の引数は,
見た目上は空っぽ。引数はOVER句に外出しされている