1

以下のようにテーブルにデータがあります:

3 つの列

 date1 fromdate value
 ---------------------
 14     0       150
 14     2       150
 14     3       150
 14     4       120
 14     5       120
 14     6       150
 14     7       150 

以下の形式でデータを取得するには、SQL クエリを記述する必要があります。

 Date1 fromdate todate value
 ----------------------------
 14     0       3      150
 14     4       5      120
 14     6       7      150

これは oracle の SQL クエリで行うことができますか?

4

2 に答える 2

3

値が 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 を置き換えるために識別子を「記入」する必要があります。これは再びアナリティクスで行うことができ、minfromdate の降順で識別子の値を選択します。次に、この値でグループ化して、必要な出力を得ることができます。

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
于 2013-02-02T11:55:45.250 に答える