-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)

しかし、このコードでは、職務記録に 2 つの行しかない従業員を取得していません。これらの従業員の「採用」アクションは、転出行になります。しかし、どちらも同じ日付です。有効なシーケンスのみが異なります。これらの従業員については、有効なシーケンス ロジックを effective_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'

しかし、これはまた、転送と同じ発効日アクションを持つ従業員を私に与えていません. 私を助けてください。

4

1 に答える 1

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 デモ

主要部分はrow_number、各 ID の行を適切な順序で個別に列挙する関数です。次のサブクエリtransfersは各 ID の最後の「TRANSFER」を検索し、メイン クエリ (最後の 2 行) は前の行を各転送に割り当てます。

于 2015-07-06T14:49:53.990 に答える