2016-07-24 3 views
0

次のように私は、2つのテーブルJob_EventsとComp_Eventsを持っている:更新データの日付の比較に基づいて、メインテーブルに最新/最古の日付データを取り出す

Job_events 

userid eventstartdt   jobcode 
    10 2014-08-18 00:00:00 j1 
    10 2015-07-27 00:00:00 j1 
    10 2015-03-23 00:00:00 j2 
    10 2015-12-28 00:00:00 j3 
    10 2015-03-23 00:00:00 j4 
    10 2015-03-23 00:00:00 j5 

Comp_Events 

userid eventstartdt  salary 
    10 2014-08-11 00:00:00 1000 
    10 2015-03-23 00:00:00 1525 
    10 2015-06-21 00:00:00 500 
    10 2016-03-21 00:00:00 2000 

予想される出力:

jobcompevents 

userid jobeventstartdt  jobcode salary 
    10 2014-08-18 00:00:00 j1  1000 
    10 2015-07-27 00:00:00 j1   500 
    10 2015-03-23 00:00:00 j2  1525 
    10 2015-12-28 00:00:00 j3   500 
    10 2015-03-23 00:00:00 j4  1525 
    10 2015-03-23 00:00:00 j5  1525 

PS:YYYYMM形式に基づいて参加することはできません。これは、月単位のデータが利用できない可能性があるためです。そのジョブレコードの最新の/最も早いものを選んで1つのレコードにマージする必要があります。

ありがとうございます。

答えて

0

追加のテストのために入力データをさらに作成しました。クエリはuseridで入力と出力を分けることができ、Comp_eventsテーブル内の開始日がすべての開始日より前のジョブの場合はsalaryの場合はNULLと表示されます(userid)。

非常に多数のタイプミスを修正するために投稿を編集しました。これが実際のセットアップから直接得られたものだった場合は、そこで修正する必要があります。

with 
    job_events (userid, eventstartdt, jobcode) as (
     select 10, date '2014-08-18', 'j1' from dual union all 
     select 10, date '2015-07-27', 'j1' from dual union all 
     select 10, date '2015-03-23', 'j2' from dual union all 
     select 10, date '2015-12-28', 'j3' from dual union all 
     select 10, date '2015-03-23', 'j4' from dual union all 
     select 10, date '2015-03-23', 'j5' from dual union all 
     select 35, date '2014-04-18', 'j1' from dual union all 
     select 35, date '2015-09-22', 'j1' from dual union all 
     select 35, date '2015-10-29', 'j8' from dual 
    ), 
    comp_events (userid, eventstartdt, salary) as (
     select 10, date '2014-08-11', 1000 from dual union all 
     select 10, date '2015-03-23', 1525 from dual union all 
     select 10, date '2015-06-21', 500 from dual union all 
     select 10, date '2016-03-21', 2000 from dual union all 
     select 35, date '2015-06-15', 2850 from dual 
    ), 
    u (userid, eventstartdt, jobcode, salary) as (
     select userid, eventstartdt, jobcode, null from job_events 
     union all 
     select userid, eventstartdt, null , salary from comp_events 
    ), 
    prep (userid, eventstartdt, jobcode, salary) as (
     select userid, eventstartdt, jobcode, 
       last_value(salary ignore nulls) over 
          (partition by userid order by eventstartdt) 
     from u 
    ) 
select userid, eventstartdt, jobcode, salary 
from  prep 
where jobcode is not null 
order by userid, jobcode, eventstartdt 
; 

出力

USERID EVENTSTARTDT JOBCODE  SALARY 
---------- ------------ ------- ---------- 
     10 2014-08-18 j1   1000 
     10 2015-07-27 j1    500 
     10 2015-03-23 j2   1525 
     10 2015-12-28 j3    500 
     10 2015-03-23 j4   1525 
     10 2015-03-23 j5   1525 
     35 2014-04-18 j1 
     35 2015-09-22 j1   2850 
     35 2015-10-29 j8   2850 

9 rows selected. 
+0

は、どうもありがとうございます –

関連する問題