Я думаю, что вы можете упростить это для всего апреля 2017 года, как здесь:
select *
from (
select a.*,
count(case when cond='X' then 1 end) over (partition by trunc(row_creation-3/24)) cnt
from table1 a
where row_creation - 3/24 between date '2017-04-01' and date '2017-05-01'
and to_char(row_creation, 'hh24') not between '03' and '10')
where cnt = 0
, где
row_creation - 3/24
назначает даты с часами 00:00
- 03:00
предыдущимday,
count(case when <cond> then 1 end) over (partition by trunc(row_creation - 3/24))
считает нежелательных строк за этот день, и, наконец:
where cnt = 0
отвечает за удаление строк, если был хотя бы один нежелательный случай на этот день.
пример dbfiddle