デモ: http://sqlfiddle.com/#!3/e7d54/23
DDL
create table T(val int identity(8,1), number int)
insert into T values
(1),(1),(1),(3),(0),(1),(1),(1),(0),(2)
DML
; WITH last_1 AS (
SELECT Max(val) As val
FROM t
WHERE number = 1
)
, last_non_1 AS (
SELECT Coalesce(Max(val), -937) As val
FROM t
WHERE EXISTS (
SELECT val
FROM last_1
WHERE last_1.val > t.val
)
AND number <> 1
)
SELECT t.val
, t.number
FROM t
CROSS
JOIN last_1
CROSS
JOIN last_non_1
WHERE t.val <= last_1.val
AND t.val > last_non_1.val
少し冗長であることは承知していますが、方法論を説明するために意図的にそのようにしています。
- 最高の
val
場所を見つけますnumber=1
。
val
がステップ 1 で見つかった数よりも小さいすべての値について、最大値を見つけますval
。number<>1
- 最後に、ステップ 1 と 2 で明らかにした値の範囲内にある行を見つけます。