トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
5-55 RowIDでパーティション切り
SQLパズル
単価テーブル
code 価格適用日 単価
---- ---------- ----
101 0 100
101 20051230 200
販売テーブル
code 購入日
---- --------
101 20051229
101 20051230
101 20051231
201 20051231
販売テーブルの行ごとに、
単価テーブルの価格適用日を元に単価を求めて、
以下の出力をする。
出力結果
code 購入日 単価
---- -------- ----
101 20051229 100
101 20051230 200
101 20051231 200
201 20051231 null
データ作成スクリプト
create table 単価 as
select 101 as code,0 as 価格適用日,100 as 単価 from dual
union select 101,20051230,200 from dual;
create table 販売 as
select 101 as code,20051229 as 購入日 from dual
union select 101,20051230 from dual
union select 101,20051231 from dual
union select 201,20051231 from dual;
SQL
--■■■分析関数を使う方法■■■
select distinct a.code,a.購入日,
Last_Value(b.単価) over(partition by a.RowID
order by b.価格適用日 Rows between Unbounded Preceding and Unbounded Following) as 単価
from 販売 a,単価 b
where a.code = b.code(+)
and a.購入日 >= b.価格適用日(+)
order by code,購入日;
--■■■分析関数を使わない方法■■■
select code,購入日,
(select b.単価 from 単価 b
where b.code = a.code
and b.価格適用日 = (select max(c.価格適用日)
from 単価 c
where c.code = b.code
and c.価格適用日 <= a.購入日)) as 単価
from 販売 a
order by code,購入日;
解説
分析関数を使う方法では、
RowIDでパーティション切りしてます。