売上テーブルから、担当者IDごと、年月ごとに、
年月時点での最高売上を表示する。
売上テーブル
担当者ID 年月 売上
-------- ------ ----
1 200501 1000
1 200502 500
1 200503 2000
1 200504 1500
2 200501 1000
2 200502 1500
2 200503 1000
2 200504 2000
3 200501 1000
3 200502 1500
3 200503 1000
出力結果
担当者ID 年月 売上 最高売上
-------- ------ ---- --------
1 200501 1000 1000
1 200502 500 1000
1 200503 2000 2000
1 200504 1500 2000
2 200501 1000 1000
2 200502 1500 1500
2 200503 1000 1500
2 200504 2000 2000
3 200501 1000 1000
3 200502 1500 1500
3 200503 1000 1500
create table 売上テーブル( 担当者ID number(1), 年月 char(6), 売上 number(4)); insert into 売上テーブル values(1,'200501',1000); insert into 売上テーブル values(1,'200502', 500); insert into 売上テーブル values(1,'200503',2000); insert into 売上テーブル values(1,'200504',1500); insert into 売上テーブル values(2,'200501',1000); insert into 売上テーブル values(2,'200502',1500); insert into 売上テーブル values(2,'200503',1000); insert into 売上テーブル values(2,'200504',2000); insert into 売上テーブル values(3,'200501',1000); insert into 売上テーブル values(3,'200502',1500); insert into 売上テーブル values(3,'200503',1000); commit;
--■■■相関サブクエリを使う方法■■■
select 担当者ID,年月,売上,
(select max(b.売上) from 売上テーブル b
where b.担当者ID=a.担当者ID
and b.年月 <= a.年月) as 最高売上
from 売上テーブル a
order by 担当者ID;
--■■■分析関数を使う方法■■■
select 担当者ID,年月,売上,
max(売上) over(partition by 担当者ID order by 年月) as 最高売上
from 売上テーブル
order by 担当者ID;
分析関数を使う方法では、 windowing_clauseを省略すると、 Range between unbounded preceding and current rowになることを使ってます。