You can use lag to look backwards in the result set. Get the previous date, sorted by id. If this is greater than the current date, then you know they're out-of-sequence:
with rws as (
select 1 id, date'2015-01-01' dt from dual union all
select 2 id, date'2017-01-01' dt from dual union all
select 3 id, date'2016-01-01' dt from dual union all
select 4 id, date'2018-01-01' dt from dual
), prev as (
select r.*, lag(dt) over (order by id) prev_dt
from rws r
)
select * from prev
where dt < prev_dt;
ID DT PREV_DT
3 01-JAN-2016 00:00:00 01-JAN-2017 00:00:00
That said, having a rule that says "account numbers and opening dates must both be in the same order" is a terrible idea. It's tough to enforce this correctly in a scalable way. And, as you've found, easy to break...