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

10-263 最初に1が出現してから値が変化した行を取得

SQLパズル

ValTable
SortKey  Val
-------  ---
10         0
13         0
16         1
19         0
22         0
23         1
24         0
26         0
29         0
32         0
33         1

SortKeyの昇順で、
最初に、Valに1が出現してから値が変化した行を取得する。
Valの値は、0か1のみとする。

出力結果
SortKey  Val
-------  ---
16         1
19         0
23         1
24         0
33         1

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
最初の行のValが1のパターン

SortKey  Val
-------  ---
10         1
14         1
16         0
17         1

出力結果
SortKey  Val
-------  ---
10         1
16         0
17         1

こちらを参考にさせていただきました(英語)


データ作成スクリプト

create table ValTable(
SortKey number(2) primary key,
Val     number(1) check (Val in(0,1)) not null);

--テストパターン1
delete from ValTable;
insert into ValTable(SortKey,Val)
select 10,0 from dual union
select 13,0 from dual union
select 16,1 from dual union
select 19,0 from dual union
select 22,0 from dual union
select 23,1 from dual union
select 24,0 from dual union
select 26,0 from dual union
select 29,0 from dual union
select 32,0 from dual union
select 33,1 from dual;
commit;

--テストパターン2
delete from ValTable;
insert into ValTable(SortKey,Val)
select 10,1 from dual union
select 14,1 from dual union
select 16,0 from dual union
select 17,1 from dual;
commit;


SQL

select SortKey,Val
from (select SortKey,Val,
      sum(Val) over(order by SortKey rows 1 preceding) as sumVal
        from ValTable)
 where sumVal = 1;


解説

データ構造に着目しつつ場合分けを使いました。

8-39 指定値の行から3行後まで出力
8-41 window指定の分析関数
10-261 前後を差が1のデータで挟まれていなければ出力