我在写查询 来自两个不同的表格。
表A和表B
这是查询。
select
A.OUT_NUM,
A.TIMESTAMP,
A.LAST_name,
A.event_type,
A.comments,
B.name
from TABLEA A
left outer join TABLEB B ON A.feed_id = B.id
where A.OUT_NUM = '12345'
and A.event_type In ('cause','status')
B.NAME
时{p> event_type = xyz
不为空,否则为空
我只想查看何时event_type in ('CAUSE','STATUS')
,但也想查看名称字段但不是空的。
第二个表是我想要实现的。
由于
答案 0 :(得分:1)
使用NVL()和LAG()函数。
使用我的示例数据的一般示例。此查询使用数据填充空白行 - 请参阅first_exam和last_exam列:
SELECT id, name, proc_date, proc_type, first_exam_date
, NVL(prev_exam_date, LAG(prev_exam_date) OVER (ORDER BY name, proc_date)) last_exam_date
FROM
(
SELECT id, name, proc_date, proc_type, first_exam_date
, NVL(first_exam_date, LAG(first_exam_date) OVER (ORDER BY name, proc_date) ) prev_exam_date
FROM
(
SELECT id
, name
, proc_date
, proc_type
, (SELECT MIN(proc_date) OVER (PARTITION BY name, proc_date)
FROM stack_test WHERE proc_type LIKE 'Exam%' AND a.id = id
) first_exam_date
FROM stack_test a
));
ID NAME PROC_DATE PROC_TYPE FIRST_EXAM_DATE LAST_EXAM_DATE
--------------------------------------------------------------------------
1 George 1/1/2013 ExamA 1/1/2013 1/1/2013
2 George 1/3/2013 TreatmentA 1/1/2013
3 George 1/5/2013 TreatmentB 1/1/2013
4 George 2/1/2013 ExamB 2/1/2013 2/1/2013
5 George 2/5/2013 TreatmentA 2/1/2013
答案 1 :(得分:1)
在评论中对您的数据做出一些假设,特别是关于如何匹配和选择替代name
值;以及我认为与您匹配的一些虚拟数据:
create table tablea(out_num number,
equip_name varchar2(5),
event_type varchar2(10),
comments varchar2(10),
timestamp date, feed_id number);
create table tableb(id number, name varchar2(10));
alter session set nls_date_format = 'MM/DD/YYYY HH24:MI';
insert into tablea values (12345, null, 'abcd', null, to_date('02/11/2013 11:12'), 1);
insert into tablea values (12345, null, 'abcd', null, to_date('02/11/2013 11:11'), 1);
insert into tablea values (12345, null, 'abcd', null, to_date('02/11/2013 11:06'), 1);
insert into tablea values (12345, null, 'abcd', null, to_date('02/11/2013 11:06'), 1);
insert into tablea values (12345, null, 'SUB', null, to_date('02/11/2013 11:11'), 2);
insert into tablea values (12345, null, 'SUB', null, to_date('02/11/2013 11:12'), 2);
insert into tablea values (12345, null, 'XYZ', null, to_date('02/11/2013 11:13'), 3);
insert into tablea values (12345, null, 'XYZ', null, to_date('02/11/2013 11:13'), 3);
insert into tablea values (12345, null, 'XYZ', null, to_date('02/11/2013 11:13'), 3);
insert into tablea values (12345, null, 'XYZ', null, to_date('02/11/2013 11:13'), 3);
insert into tablea values (12345, null, 'XYZ', null, to_date('02/11/2013 11:13'), 3);
insert into tablea values (12345, null, 'XYZ', null, to_date('02/11/2013 11:03'), 3);
insert into tablea values (12345, null, 'CAUSE', 'APPLE', to_date('02/11/2013 11:13'), 4);
insert into tablea values (12345, null, 'CAUSE', 'APPLE', to_date('02/11/2013 11:13'), 4);
insert into tablea values (12345, null, 'CAUSE', 'APPLE', to_date('02/11/2013 11:13'), 4);
insert into tablea values (12345, null, 'STATUS', 'BOOKS', to_date('02/11/2013 11:13'), 5);
insert into tablea values (12345, null, 'STATUS', 'BOOKS', to_date('02/11/2013 11:13'), 5);
insert into tablea values (12345, null, 'STATUS', 'BOOKS', to_date('02/11/2013 11:03'), 5);
insert into tableb values(3, 'LION');
这会得到你的结果:
select * from (
select a.out_num,
a.timestamp,
a.equip_name,
a.event_type,
a.comments,
coalesce(b.name,
first_value(b.name)
over (partition by a.out_num
order by b.name nulls last)) as name
from tablea a
left outer join tableb b on a.feed_id = b.id
where a.out_num = '12345'
and a.event_type in ('CAUSE', 'STATUS', 'XYZ')
)
where event_type in ('CAUSE', 'STATUS');
OUT_NUM TIMESTAMP EQUIP_NAME EVENT_TYPE COMMENTS NAME
---------- ------------------ ---------- ---------- ---------- ----------
12345 02/11/2013 11:03 STATUS BOOKS LION
12345 02/11/2013 11:13 STATUS BOOKS LION
12345 02/11/2013 11:13 STATUS BOOKS LION
12345 02/11/2013 11:13 CAUSE APPLE LION
12345 02/11/2013 11:13 CAUSE APPLE LION
12345 02/11/2013 11:13 CAUSE APPLE LION
内部查询包含XYZ
,如果直接匹配的值为first_value()
,则使用分析name
函数选择null
- coalesce
可能不会如果真的永远不会直接匹配,那就是必要的。 (如果假设错误,您可能还需要调整partition by
或order by
子句。外部查询只会删除XYZ
记录,因为您不需要这些记录。
如果您想从任何匹配记录中获取name
值,则只需删除内部查询中的过滤器。
但现在你可能更有可能拥有多个非空记录;这将为您提供一个匹配a.feed_id
(如果存在),或者第一个(按字母顺序,ish)匹配out_num
(如果不存在)。您可以通过b.id
或tableb
中的任何其他列进行排序;按tablea
中的任何内容排序都需要一个不同的解决方案。如果你只有一个可能的匹配,那么它并不重要,你可以省略order by
,尽管最好还是有它。
如果我为其他out_num
添加更多数据:
insert into tablea values (12346, null, 'abcd', null, to_date('02/11/2013 11:11'), 1);
insert into tablea values (12346, null, 'SUB', null, to_date('02/11/2013 11:12'), 2);
insert into tablea values (12346, null, 'XYZ', null, to_date('02/11/2013 11:13'), 6);
insert into tablea values (12346, null, 'CAUSE', 'APPLE', to_date('02/11/2013 11:14'), 4);
insert into tablea values (12346, null, 'STATUS', 'BOOKS', to_date('02/11/2013 11:15'), 5);
insert into tableb values(1, 'TIGER');
...然后这个 - 只是删除了过滤器,而我这次遗漏了coalesce
- 为12345
提供了相同的答案,并为12346
提供了相同的答案:
select * from (
select a.out_num,
a.timestamp,
a.equip_name,
a.event_type,
a.comments,
first_value(b.name)
over (partition by a.out_num
order by b.name nulls last) as name
from tablea a
left outer join tableb b on a.feed_id = b.id
)
where out_num = '12346'
and event_type in ('CAUSE', 'STATUS');
OUT_NUM TIMESTAMP EQUIP_NAME EVENT_TYPE COMMENTS NAME
---------- ------------------ ---------- ---------- ---------- ----------
12346 02/11/2013 11:14 CAUSE APPLE TIGER
12346 02/11/2013 11:15 STATUS BOOKS TIGER
...其中TIGER
与abcd
相关联,而不是XYZ
。