トップページに戻る
次のmodel句のサンプルへ
前のmodel句のサンプルへ
model句03 count(distinct Val) over(order by SortKey)の代用
SQLパズル
distinctCountWithOrderテーブル
SortKey Val
------- ---
1 a
2 b
3 c
4 a
5 b
6 d
7 e
下記のクエリに相当する結果を出力する。
select SortKey,Val,
count(distinct Val) over(order by SortKey) as distinctVal
from distinctCountWithOrder
order by SortKey;
出力結果
SortKey Val distinctVal
------- --- -----------
1 a 1
2 b 2
3 c 3
4 a 3
5 b 3
6 d 4
7 e 5
データ作成スクリプト
create table distinctCountWithOrder(SortKey,Val) as
select 1,'a' from dual union all
select 2,'b' from dual union all
select 3,'c' from dual union all
select 4,'a' from dual union all
select 5,'b' from dual union all
select 6,'d' from dual union all
select 7,'e' from dual;
SQL
--■■■model句を使う方法■■■
select SortKey,Val,distinctVal
from distinctCountWithOrder
model
dimension by (SortKey)
measures(Val,Val distinctVal)
rules(distinctVal[SortKey is any] = count(distinct Val)[SortKey <= CV(SortKey)]);
--■■■分析関数を使う方法■■■
select SortKey,Val,
sum(willSum) over(order by SortKey) as distinctVal
from (select SortKey,Val,
case Row_Number() over(partition by Val order by SortKey)
when 1 then 1 else 0 end as willSum
from distinctCountWithOrder);
--■■■相関サブクエリを使う方法■■■
select SortKey,Val,
(select count(distinct b.Val)
from distinctCountWithOrder b
where b.SortKey <= a.SortKey) as distinctVal
from distinctCountWithOrder a;
解説
文法エラーとなる。
distinctオプションとorder by指定の併用を、model句で代用する方法です。
相関サブクエリを使う感覚に近いですね。
10-214 重複を除いた訪問者数