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

8-39 指定値の行から3行後まで出力

SQLパズル

ABTable
ColA  ColB
----  ----
   1     1
   1     2
   1     4
   2     1
   2     3  ←出力対象
   3     1  ←出力対象
   3     3  ←出力対象
   5     1  ←出力対象
   5     2

order by A,B
のソートで、(A,B) = (2,3) の行から3行後まで出力する。

出力結果
ColA  ColB
----  ----
   2     3
   3     1
   3     3
   5     1


データ作成スクリプト

create table ABTable(ColA,ColB) as
select 1,1 from dual union
select 1,2 from dual union
select 1,4 from dual union
select 2,1 from dual union
select 2,3 from dual union
select 3,1 from dual union
select 3,3 from dual union
select 5,1 from dual union
select 5,2 from dual;


SQL

select ColA,ColB
from (select ColA,ColB,
      count(case when ColA=2 and ColB=3
                 then 1 end)
      over(order by ColA,ColB rows 3 preceding) as cnt
        from ABTable)
 where cnt = 1
order by ColA,ColB;


解説

Lead関数やLag関数を複数回使う場合は、
Rows指定やRange指定の
count関数やsum関数が使えないか考えるとよいでしょう。

なぜならば、
Lag関数を使って3値論理で条件判定するよりも、
window指定のCount関数で2値論理で条件判定するクエリのほうがシンプルだからです。

TransactSQL---Unique values only

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