OLAP専用関数
では次に、
ROW_ | レコードに一意な連番を振る |
RANK | レコードのランキングを算出する。同位のレコードが複数存在する場合は、 |
DENSE_ | 基本的にRANKと同じだが、 |
これらOLAP専用の関数は、
構文は先ほど説明したものとまったく同じですが、
では、
- 第一の軸
(カット) :どんなキーでこの結果をカットするべきか? - 口座ごとにカットするので、
account_ id - 第二の軸
(走査順序) :どんなキーで走査するべきか? - 入金の多い順なので、
処理金額の降順。つまりprc_ amtの降順
従って、
-- 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
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句に外出しされている
移動平均:対象行数を制限したOLAP関数
さて、
今度はこれを少し改変して、
OLAP関数には、
--移動平均(3レコードごと):My SQL以外
SELECT account_id,
record_date,
prc_amt,
AVG(prc_amt) OVER (PARTITION BY account_id
ORDER BY record_date
ROWS 2 PRECEDING) AS cumulative_avg_3
FROM Accounts;
account_id record_date prc_amt cumulative_avg_3 ---------- ----------- ------- ---------------- A 2010-01-16 1,000 1000 A 2010-01-17 20,000 10500 A 2010-01-18 -3,000 6000 A 2010-01-19 -500,000 -161000 A 2010-01-20 23,000 -160000 B 2010-01-16 48,000 48000 B 2010-01-17 98,000 73000 B 2010-01-18 -5,000 47000 B 2010-01-19 30,000 41000 B 2010-01-20 -100,000 -25000 C 2010-01-16 5,000 5000 C 2010-01-17 12,000 8500 C 2010-01-18 30,000 15667 C 2010-01-19 1,000 14333 C 2010-01-20 500 10500
ROWS 2 PRECEDING
は、ROWS 2 FOLLOWING
とすることもできます。このように、
- OLAP関数のルール 4
- 計算対象行の制限は、
ウィンドウ (パーティション) の中でさらにフレームで行うことができる
さて、
1/16: 1,000 = 1,000 / 1
1/17: 10,500 = (1,000 + 20,000) / 2
1/18: 6,000 = (1,000 + 20,000 + (-3,000)) / 3
1/19:-161,000 = (20,000 + (-3,000) + (-500,000)) / 3
1/20:-160,000 = ((-3,000) + (-500,000) + 23,000) / 3
この移動平均をOLAP関数を使わずに求めるのは、