0

ここに私の最初の質問があります: 2 つのデータセットをマージする

残念ながら、ここで詳しく説明したいいくつかの複雑な部分を省略しました。

したがって、2 つのテーブル events_source_1 と events_source_2 テーブルがあります。これらのテーブルから結果のデータセットにデータセットを生成する必要があります (3 番目のテーブルに挿入することはできますが、それは関係ありません)。

events_source_1 には履歴イベント データが含まれており、最新のイベントを取得する必要があります (そのために次のことを行っています:

select event_type,b,c,max(event_date),null next_event_date
from events_source_1
group by event_type,b,c,event_date,null

events_source_2 には将来のイベント データが含まれており、次のことを行う必要があります。

select event_type,b,c,null event_date, next_event_date
from events_source_2
where b>sysdate;

外部結合ステートメントを配置して空白を埋める方法 (つまり、event_source_2 から同じ event_type,b,c が見つかった場合、next_event_date は最初に見つかった日付で埋められます)

事前にご支援いただき、誠にありがとうございます。

4

3 に答える 3

2

あなたの質問が正しいことを願っています。これは、最新event_dateevents_source_1perを返しevent_type, b, c、最小event_dateのものを追加する必要がありevent_source_2ます。

Select es1.event_type, es1.b, es1.c,
       Max(es1.event_date),
       Min(es2.event_date) As next_event_date
From events_source_1 es1
Left Join events_source_2 es2 On (     es2.event_type = es1.event_type
                                   And es2.b = es1.b
                                   And es2.c = es1.c
                                 )
Group By c1.event_type, c1.b, c1.c
于 2010-06-03T17:50:25.437 に答える
1

グループバイを使用して最大値を選択する必要があるテーブルを仮想テーブルに作成し、前の質問への回答で提供したように完全な外部結合を実行できます。

クエリの先頭に次のようなものを追加します。

with past_source as (
select event_type, b, c, max(event_date)
from event_source_1
group by event_type, b, c, event_date
)

次に、実際のテーブルであるかのように past_source を使用し、表示されている with 句の閉じ括弧の直後に選択を続けることができます。

于 2010-06-07T21:49:13.313 に答える
0

最終的に 2 段階のプロセスを実行します。最初のステップではイベント テーブル 1 からデータを入力し、2 番目のステップではターゲット (最初のステップのデータセット) と別のソースの間のデータをマージします。申し訳ありませんが、法的な理由により、テーブル名を難読化し、以下のコードのいくつかの列を省略しなければなりませんでした。SQLは次のとおりです。

    INSERT INTO EVENTS_TARGET (VEHICLE_ID,EVENT_TYPE_ID,CLIENT_ID,EVENT_DATE,CREATED_DATE) 
select VEHICLE_ID, EVENT_TYPE_ID, DEALER_ID, 
max(EVENT_INITIATED_DATE) EVENT_DATE, sysdate CREATED_DATE
FROM events_source_1 
GROUP BY VEHICLE_ID, EVENT_TYPE_ID, DEALER_ID, sysdate;

2番目のステップは次のとおりです。

    MERGE INTO EVENTS_TARGET tgt
USING (
  SELECT ee.VEHICLE_ID VEHICLE_ID, ee.POTENTIAL_EVENT_TYPE_ID POTENTIAL_EVENT_TYPE_ID, ee.CLIENT_ID CLIENT_ID,ee.POTENTIAL_EVENT_DATE POTENTIAL_EVENT_DATE FROM EVENTS_SOURCE_2 ee WHERE ee.POTENTIAL_EVENT_DATE>SYSDATE) src
ON (tgt.vehicle_id = src.VEHICLE_ID AND tgt.client_id=src.client_id AND tgt.EVENT_TYPE_ID=src.POTENTIAL_EVENT_TYPE_ID)
WHEN MATCHED THEN
 UPDATE SET tgt.NEXT_EVENT_DATE=src.POTENTIAL_EVENT_DATE
WHEN NOT MATCHED THEN
insert (tgt.VEHICLE_ID,tgt.EVENT_TYPE_ID,tgt.CLIENT_ID,tgt.NEXT_EVENT_DATE,tgt.CREATED_DATE) VALUES (src.VEHICLE_ID, src.POTENTIAL_EVENT_TYPE_ID, src.CLIENT_ID, src.POTENTIAL_EVENT_DATE, SYSDATE)
;
于 2010-06-07T16:26:52.140 に答える