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对这些行进行分组,这样当我运行它时应该给出以下结果。 rank列应该是由SEQ_START分组的WORKING_DAYS(或任何其他数字)。请注意,即使10/10/2013和10/11/2013的SEQ_START为0但仍然不应该有10/1/2013,而应该有10/10/2013,因为在10/8/2013,序列是破(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”值而不是他们应该有10/10/2013因为序列在10上被打破/ 8/2013,其中有1个用于SEQ_START
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'
答案 0 :(得分: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