値が 150 の行を 2 つのセクションに分割する必要があります。これは、分析関数を使用して行うことができます。このlead
関数を使用すると、次の行の値をある順序で見ることができます。この場合、fromdate によって値の順序が異なる時期を見つけたいとします。
select lead(value) over (order by fromdate) from tab;
次に、これを現在の値と比較して、いつ変化するかを確認し、変化したときに識別子を出力できます。
select value, case when ld <> value or ld is null then rownum end c from (
select value, lead(value) over (order by fromdate) ld from tab
)
VALUE, C
-----------
150 null
150 null
150 3
120 null
120 5
150 null
150 7
次に、null を置き換えるために識別子を「記入」する必要があります。これは再びアナリティクスで行うことができ、min
fromdate の降順で識別子の値を選択します。次に、この値でグループ化して、必要な出力を得ることができます。
select date1, value, d, min(fromdate), max(fromdate)
from (
select date1, fromdate, value,
--"fill down" the discriminator, so you can group by it at the next level
min(c) over (order by fromdate desc) d
from (
select date1, fromdate, value, ld,
--compare the next value with the current, if they're different
--show an indicator
case when value <> ld or ld is null then rownum else null end c
from (
select date1, fromdate, value,lead(value) over (order by fromdate) ld
from tab
)
)
)
group by date1, value, d