売上テーブルから、担当者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になることを使ってます。