这是我原来的问题: merging two data sets
不幸的是我省略了一些错误,我想在这里详细说明。
所以我有两个表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将填充第一个找到的日期
非常感谢您的帮助。
答案 0 :(得分:2)
希望我的问题是正确的。这应该返回每event_date
events_source_1
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
的最低{{1}}。
{{1}}
答案 1 :(得分: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子句的结束parens之后继续你的选择。
答案 2 :(得分:0)
我最终做了两个步骤:第一步填充事件表1中的数据,第二步MERGES目标(第一步的数据集)和另一个源之间的数据。请原谅我,但由于法律原因,我不得不混淆表名并省略下面代码中的一些列。这是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)
;