2020/04/28(Tue) 17:48:27 編集(投稿者)
■No94641 (紅子 さん) に返信
効率的なSQL文ではないと思いますが
方向性だけ示してみました。
下記のような中間テーブルを作れば要望事項を達成できそうです。
select
*
,
(
select max(t5.NO)
from
(
select *
from [TEST].[dbo].[test] as t4
order by t4.NO, t4.FLG OFFSET 0 ROWS
) as t5
where t5.FLG = t6.FLG and t5.NO < t6.NoEnd
) as NoStart
from
(
SELECT
*
,
(
select max(t3.NO)
from
(
select *
from [TEST].[dbo].[test] as t2
order by t2.NO, t2.FLG OFFSET 0 ROWS
) as t3
where t3.FLG <> t1.FLG and t3.NO < t1.NO
) as NoEnd
FROM [TEST].[dbo].[test] as t1
order by t1.NO, t1.FLG OFFSET 0 ROWS
) as t6
NO DATA FLG NoEnd NoStart
10 1 NULL NULL
20 10 2 10 NULL
20 2 10 NULL
30 2 10 NULL
40 1 30 10
50 2 40 30
50 5,7 2 40 30
利用の仕方ですが、
40がヒットした場合、
NoStart=10より大きくかつNoEnd=30以下かつFLG=1でないレコードを抽出すればOKのはず。
NoEndの算出方法は、40を例にした場合、
NO=40より小さく、FLG=1でなく、最大のNO=30を取得。
NoStartの算出方法は、40を例にした場合、
NoEnd=30より小さく、FLG=1であり、最大のNO=10を取得。