0

这是我最初的问题: 合并两个数据集

不幸的是,我省略了一些细节,我想在这里详细说明。

所以我有两个表 events_source_1 和 events_source_2 表。我必须将这些表中的数据集生成到结果数据集中(我可以将其插入到第三个表中,但这无关紧要)。

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_1perevent_type, b, c并添加最低event_dateevent_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

您可以将需要使用 group by 选择最大值的表制作成虚拟表,然后按照我在上一个问题的答案中提供的方式进行完全外连接。

在查询的顶部添加类似这样的内容:

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

我最终做了两步过程:第一步填充事件表 1 中的数据,第二步合并目标(来自第一步的数据集)和另一个源之间的数据。请原谅我,但出于法律原因,我不得不混淆表名并省略下面代码中的某些列。这是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;

这是第二步:

    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 回答