トップページに戻る
次の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;
解説
自レコードと次のレコードとの、日の差を、
結合するレコード数としてます。