Я хотел бы сделать это с помощью аналитической функции для проверки наличия «A» функции, а затем присоединиться к другой таблице, чтобы получить DT.
Как написано в вашем вопросе, я думаю, что это то, что вы после:
with table_a as (select 1 ord, 'A' feature from dual union all
select 1 ord, 'B' feature from dual union all
select 1 ord, 'C' feature from dual union all
select 2 ord, 'B' feature from dual union all
select 2 ord, 'C' feature from dual union all
select 3 ord, 'A' feature from dual union all
select 3 ord, 'C' feature from dual union all
select 4 ord, 'A' feature from dual union all
select 4 ord, 'B' feature from dual),
table_b as (select 1 ord, to_date('01/08/2015', 'dd/mm/yyyy') dt from dual union all
select 2 ord, to_date('01/08/2015', 'dd/mm/yyyy') dt from dual union all
select 3 ord, to_date('01/08/2015', 'dd/mm/yyyy') dt from dual union all
select 4 ord, to_date('31/07/2015', 'dd/mm/yyyy') dt from dual union all
select 5 ord, to_date('31/07/2015', 'dd/mm/yyyy') dt from dual),
res as (select ta.ord,
ta.feature,
max(case when ta.feature = 'A' then 'A' end) over (partition by ta.ord) a_present,
tb.dt
from table_a ta
inner join table_b tb on (ta.ord = tb.ord))
select ord,
feature
from res
where a_present is not null
and to_char(dt, 'mm') != '08';
ORD FEATURE
---------- -------
4 A
4 B
Однако, результаты, которые вы указали показать, что вы на самом деле хотели результаты, которые содержавший «A» в каждой группе и сделал падение в августе месяце
with table_a as (select 1 ord, 'A' feature from dual union all
select 1 ord, 'B' feature from dual union all
select 1 ord, 'C' feature from dual union all
select 2 ord, 'B' feature from dual union all
select 2 ord, 'C' feature from dual union all
select 3 ord, 'A' feature from dual union all
select 3 ord, 'C' feature from dual union all
select 4 ord, 'A' feature from dual union all
select 4 ord, 'B' feature from dual),
table_b as (select 1 ord, to_date('01/08/2015', 'dd/mm/yyyy') dt from dual union all
select 2 ord, to_date('01/08/2015', 'dd/mm/yyyy') dt from dual union all
select 3 ord, to_date('01/08/2015', 'dd/mm/yyyy') dt from dual union all
select 4 ord, to_date('31/07/2015', 'dd/mm/yyyy') dt from dual union all
select 5 ord, to_date('31/07/2015', 'dd/mm/yyyy') dt from dual),
res as (select ta.ord,
ta.feature,
max(case when ta.feature = 'A' then 'A' end) over (partition by ta.ord) a_present,
tb.dt
from table_a ta
inner join table_b tb on (ta.ord = tb.ord))
select ord,
feature
from res
where a_present is not null
and to_char(dt, 'mm') = '08';
ORD FEATURE
---------- -------
1 A
1 B
1 C
3 A
3 C
Вам не нужно, и порядок не равен нулю. Вы путаете IN с NOT IN, где nulls действительно может быть проблемой. –
Я думаю, что 'month (date)' должен быть 'extract (month from date)' в Oracle. –
@ThorstenKettner doh, что правильно, не знаю, что я думал –