トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-72 日付の埋め立てその1

SQLパズル

hogeテーブル
  S_DATE    FLG
----------  ---
2006/01/01    1
2006/01/06    2
2006/01/10    3

flgに前のs_dateと同じflgの値を入れつつ
日付を一日ずつ足していく
といった出力をする。

出力結果
  S_DATE    FLG
----------  ---
2006/01/01    1
2006/01/02    1
2006/01/03    1
2006/01/04    1
2006/01/05    1
2006/01/06    2
2006/01/07    2
2006/01/08    2
2006/01/09    2
2006/01/10    3


データ作成スクリプト

create table hoge(
s_date date,
flg    number(1));

insert into hoge values (to_date('20060101','yyyymmdd'),1);
insert into hoge values (to_date('20060106','yyyymmdd'),2);
insert into hoge values (to_date('20060110','yyyymmdd'),3);
commit;


SQL

--■■■データディクショナリを使う方法■■■
select S_DATE+Counter-1 as S_DATE,FLG
from (select S_DATE,FLG,
      Lead(S_DATE) over(order by S_DATE) as LeadDate
      from hoge) a,(select RowNum as Counter from all_catalog) b
where b.Counter <= nvl(a.LeadDate-a.S_DATE,1)
order by S_DATE;

--■■■model句を使う方法(10g以降)■■■
select S_DATE,FLG
  from hoge
 model
 partition by (RowNum as PID)
 dimension by (0 as soeji)
 measures(S_DATE,FLG,
          Lead(S_DATE,1,S_DATE+1) over(order by S_DATE) as nextDt)
 rules ITERATE (1000) UNTIL (S_DATE[0]+ITERATION_NUMBER = nextDt[0]-1)
 (S_DATE[0+ITERATION_NUMBER]=S_DATE[0]+ITERATION_NUMBER,
  FLG[any]=flg[0])
order by S_DATE;


解説

自レコードと次のレコードとの、日の差を、
結合するレコード数としてます。