トップページに戻る    次の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でパーティション切りしてます。