1
select * from grouping;

上記のクエリは次のようになります。

WORKING_DAYS,DATE_TYPE,SEQ_START
10/11/2013  ,L        ,0
10/10/2013  ,L        ,0
10/8/2013   ,L        ,1
10/6/2013   ,H        ,0
10/5/2013   ,H        ,0
10/4/2013   ,L        ,0
10/3/2013   ,L        ,0
10/2/2013   ,L        ,0
10/1/2013   ,L        ,0

これらの行を SEQ_START でグループ化して、実行すると次の結果が得られるようにします。ランク列は、SEQ_START でグループ化された WORKING_DAYS (またはその他の数値) である必要があります。2013 年 10 月 10 日と 2013 年 10 月 11 日の SEQ_START は 0 ですが、2013 年 10 月 10 日ではなく 2013 年 10 月 10 日であることに注意してください。壊れています (SEQ_START の場合は 0)。

WORKING_DAYS,DATE_TYPE,SEQ_START,rank
10/1/2013   ,L        ,0        ,10/1/2013
10/2/2013   ,L        ,0        ,10/1/2013
10/3/2013   ,L        ,0        ,10/1/2013
10/4/2013   ,L        ,0        ,10/1/2013
10/8/2013   ,L        ,1        ,10/8/2013
10/10/2013  ,L        ,0        ,10/10/2013
10/11/2013  ,L        ,0        ,10/10/2013

私は次のクエリを書きましたが、これはほぼ私が期待するものを返しますが、10/10/2013 と 10/11/2013 に "0" の値を与えています。 SEQ_START が 1 の 2013

select working_days,  
       date_type, 
       seq_start, 
       FIRST_VALUE(working_days)  OVER (PARTITION BY seq_start 
                                        ORDER BY working_days) "rank"
  from grouping 
 where date_type = 'L'
4

1 に答える 1

1
select 
  working_days,  date_type, seq_start, 
  FIRST_VALUE(working_days) OVER (PARTITION BY grp ORDER BY working_days) "rank"
from (
  select 
    working_days, date_type, seq_start,
    sum(front) over(order by working_days) as grp
  from (
    select 
      working_days, date_type, seq_start,
      decode(seq_start, lag(seq_start)over(order by working_days), 0, 1) as front
    from t1
  )
)
where date_type = 'L'
order by 1 

フィドル

于 2013-10-01T17:03:25.190 に答える