2015-07-06 5 views
-1

Мне нужно получить строки «Перенос» сотрудников, что означает предыдущее действие или предыдущую строку действия «Перенос». В настоящее время я делаю это только по условию effective_start_date. В настоящее время это код, который я поставил: -Получение предшествующего действия, такого как «Перенос»

SELECT PAAM.EFFECTIVE_START_DATE, PAAM.PERSON_ID,PAAM.ACTION_CODE FROM PER_ALL_ASSIGNMENTS_M PAAM 
WHERE 
TO_CHAR(PAAM.EFFECTIVE_START_DATE,'YYYY-MM-DD') = 
(SELECT TO_CHAR(MAX(PAAM1.EFFECTIVE_START_DATE),'YYYY-MM-DD') FROM FUSION.PER_ALL_ASSIGNMENTS_M PAAM1 
WHERE PAAM1.EFFECTIVE_START_DATE< (SELECT MAX(EFFECTIVE_START_DATE) FROM FUSION.PER_ALL_ASSIGNMENTS_M PAAM2 WHERE PAAM2.ACTION_CODE='TRANSFER' 
AND PAAM2.PERSON_ID=PAAM1.PERSON_ID AND SYSDATE BETWEEN PAAM2.EFFECTIVE_START_DATE AND PAAM2.EFFECTIVE_END_DATE) AND PAAM1.PERSON_ID=PAAM.PERSON_ID) 

Но этот код я не получаю тех сотрудников, у которых есть только две строки в их работе Запись- Предположим, есть прокат, а другой один трансфер. Для действий сотрудников «Hire» это будет строка Transfer Out. Но оба они в одну дату. Только эффективная последовательность отличается. Для этих сотрудников мне нужно добавить эффективную логику последовательности вместе с эффективным_start_date. Я написали код: -

select PAAM1.effective_start_date, paam1.effective_end_date, paam1.action_code, paam1.effective_sequence from PER_ALL_assignments_M PAAM,PER_ALL_ASSIGNMENTS_M PAAM1, per_all_people_f papf 
where PAAM.person_id = paam1.person_id 
and paam.person_id=papf.person_id 
and paam.effective_start_date=(select max(paam3.effective_start_date) 
from per_all_assignments_m paam3 where paam.person_id=paam3.person_id) 
and paam.effective_sequence=  
(select max (effective_sequence) from per_all_assignments_m paam4 where paam.person_id=paam4.person_id) 
and paam1.effective_start_date = (SELECT MAX(paam5.EFFective_start_DaTe) from per_all_assignments_m paam5 
where paam5.person_id = paam1.person_id and (paam5.effective_start_date < paam.effective_start_date 
or (paam5.effective_start_date = paam.effective_start_date and paam1.effective_sequence < paam.effective_sequence))) 
and paam1.effective_sequence =(SELECT MAX(paam6.effective_sequence) from per_all_assignments_m paam6 
where paam6.person_id = paam1.person_id and paam6.effective_start_date = paam1.effective_start_date 
and (paam1.effective_start_date<paam.effective_start_date or(paam1.effective_start_date=paam.effective_start_date and paam6.effective_sequence< paam.effective_sequence))) 
and paam.action_code='TRANSFER' 

Но это также не дает мне сотрудников с таким же эффективным действием, как Передача. Пожалуйста, помогите мне.

ответ

0

Ваши вопросы и объяснения довольно трудно понять, было бы хорошо, если бы вы отредактировали свой вопрос и добавили примеры ваших данных и ожидаемого результата. Во всяком случае здесь запрос, который работает в соответствии с заданными правилами (или, по крайней мере, как я их понял):

with 
    data as (
    select effective_start_date esd, effective_end_date eed, 
      person_id id, action_code action, 
      row_number() over (partition by person_id 
           order by effective_start_date desc, 
             effective_sequence desc) rn 
     from per_all_assignments_m p), 
    transfers as (
    select id, min(rn) rn from data 
     where action = 'TRANSFER' and sysdate between esd and eed group by id) 
select d.id, d.esd, d.action 
    from data d join transfers t on d.id = t.id and d.rn = t.rn + 1 

SQLFiddle demo

Основная часть функции row_number которая перебирает строки отдельно для каждого идентификатора в надлежащем порядке, следующий подзапрос transfers находит последний «ПЕРЕДАЧА» для каждого идентификатора и основного запроса (последние две строки) присваивает предыдущую строку каждой передаче.