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

8-41 window指定の分析関数

SQLパズル

MyTable
ID  Seq
--  ---
 1    1  ←出力対象
 1    2  ←出力対象
 2    1
 2    3  ←出力対象
 3    4  ←出力対象
 4    1  ←出力対象
 4    2  ←出力対象
 4    4
 6    1  ←出力対象
 6    2  ←出力対象
 7    2
 7    3  ←出力対象

IDが1小さくて、Seqが等しい行が存在しない行を出力する。

出力結果
ID  Seq
--  ---
 1    1
 1    2
 2    3
 3    4
 4    1
 4    2
 6    1
 6    2
 7    3


データ作成スクリプト

create table MyTable(ID,Seq) as
select 1,1 from dual union all
select 1,2 from dual union all
select 2,1 from dual union all
select 2,3 from dual union all
select 3,4 from dual union all
select 4,1 from dual union all
select 4,2 from dual union all
select 4,4 from dual union all
select 6,1 from dual union all
select 6,2 from dual union all
select 7,2 from dual union all
select 7,3 from dual;


SQL

--■■■分析関数を使う方法1■■■
select ID,Seq
from (select ID,Seq,
      count(*) over(partition by Seq
      order by ID range 1 preceding) as cnt
        from MyTable) a
 where cnt =1
order by ID,Seq;

--■■■分析関数を使わない方法■■■
select ID,Seq
  from MyTable a
 where not exists(select 1 from MyTable b
                   where b.ID  = a.ID-1
                     and b.Seq = a.Seq)
order by ID,Seq;


解説

この場合は、
Lag関数よりも、Rows指定のCount関数を使ったほうがシンプルになります。

TransactSQL---Unique values only

8-39 指定値の行から3行後まで出力
10-261 前後を差が1のデータで挟まれていなければ出力
10-263 最初に1が出現してから値が変化した行を取得