2016-07-28 2 views
0

я следующий запросOracle SQL, как группе, но есть несколько строк, если группа повторяется на более поздний срок

select paaf.assignment_id, 
     paaf.position_id, 
     paaf.effective_start_date effective_start_date, 
     paaf.effective_end_date effective_end_date 
from per_all_assignments_f paaf 
where paaf.position_id is not null 
and paaf.assignment_type in ('E', 'C') 
and paaf.primary_flag = 'Y' 
and paaf.assignment_number like '209384%' 
order by 3 

Который возвращает

"assignment_id" "position_id" "effective_start_date" "effective_end_date" 
6518 5323 01/01/2013 28/02/2014 
6518 8133 01/03/2014 30/06/2014 
6518 8133 01/07/2014 31/10/2015 
6518 239570 01/11/2015 15/11/2015 
6518 239570 16/11/2015 31/12/2015 
6518 8133 01/01/2016 27/07/2016 
6518 8133 28/07/2016 31/12/4712 

Я сгруппировал это с помощью:

select paaf.assignment_id, 
     paaf.position_id, 
     min(paaf.effective_start_date) effective_start_date, 
     max(paaf.effective_end_date) effective_end_date 
from per_all_assignments_f paaf 
where paaf.position_id is not null 
and paaf.assignment_type in ('E', 'C') 
and paaf.primary_flag = 'Y' 
and paaf.assignment_number like '209384%' 
group by paaf.assignment_id, paaf.position_id 

Который возвращает:

"assignment_id" "position_id" "effective_start_date" "effective_end_date" 
6518 5323 01/01/2013 28/02/2014 
6518 8133 01/03/2014 31/12/4712 
6518 239570 01/11/2015 31/12/2015 

Но мне нужен запрос, который возвращает

"assignment_id" "position_id" "effective_start_date" "effective_end_date" 
6518 5323 01/01/2013 28/02/2014 
6518 8133 01/03/2014 31/10/2015 
6518 239570 01/11/2015 31/12/2015 
6518 8133 01/01/2016 31/12/4712 

То есть сказать position_id из 8133 должен иметь два ряда, так как есть две секции в хронологическом порядке, которые должны быть сгруппированы в 2 ряда, а не 1 (для 8133) ,

Есть ли способ выполнить это, используя порядок даты?

Ответ оказался:

with paaf as 
      (
       select paaf.assignment_id, 
         paaf.position_id, 
         paaf.effective_start_date effective_start_date, 
         paaf.effective_end_date effective_end_date 
       from per_all_assignments_f paaf 
       where paaf.position_id is not null 
       and paaf.assignment_type in ('E', 'C') 
       and paaf.primary_flag = 'Y' 
      -- and paaf.assignment_number like '209384%' 
       order by 1, 3 
      ) 
      select paaf2.assignment_id, 
        paaf2.position_id, 
        min(paaf2.effective_start_date) as effective_start_date, 
        max(paaf2.effective_end_date) as effective_end_date 
      from (
         select paaf.*, 
          row_number() over (order by paaf.assignment_id, paaf.effective_start_date) as seqnum, 
          row_number() over (partition by paaf.assignment_id, paaf.position_id order by paaf.assignment_id, paaf.effective_start_date) as seqnum_p 
         from paaf 
        ) paaf2 
      group by (paaf2.seqnum - paaf2.seqnum_p), paaf2.assignment_id, paaf2.position_id  

ответ

2

Это проблема Зазоры-и-островки. Существуют разные подходы, но простой использует разницу номера строки:

with paaf as (<your first query here> 
    ) 
select paaf.assignment_id, 
     paaf.position_id, 
     min(paaf.effective_start_date) as effective_start_date, 
     max(paaf.effective_end_date) as effective_end_date 
from (select paaf.*, 
      row_number() over (order by effective_start_date) as seqnum, 
      row_number() over (partition by position_id order by effective_start_date) as seqnum_p 
     from paaf 
    ) paaf 
group by (seqnum - seqnum_p), position_id, assignment_id; 
+0

К сожалению, это не работает, когда я делаю это для всех сотрудников. Не знаете, как изменить его при использовании всех назначений. – Superdooperhero

+0

@Superdooperhero. , , Возможно, вы должны задать другой вопрос. –