我的理解方式:
SQL> with test (id, col1, col2) as
2 (select 123123, to_date('23.07.2019 22:00', 'dd.mm.yyyy hh24:mi'), to_date('31.12.9999 00:00', 'dd.mm.yyyy hh24:mi') from dual union all
3 select 123123, to_date('23.07.2019 22:00', 'dd.mm.yyyy hh24:mi'), to_date('04.07.2019 00:00', 'dd.mm.yyyy hh24:mi') from dual union all
4 select 123123, to_date('23.07.2019 22:00', 'dd.mm.yyyy hh24:mi'), to_date('05.07.2019 00:00', 'dd.mm.yyyy hh24:mi') from dual union all
5 --
6 select 123123, to_date('25.07.2019 04:05', 'dd.mm.yyyy hh24:mi'), to_date('31.12.9999 00:00', 'dd.mm.yyyy hh24:mi') from dual union all
7 select 123123, to_date('25.07.2019 04:05', 'dd.mm.yyyy hh24:mi'), to_date('04.07.2019 00:00', 'dd.mm.yyyy hh24:mi') from dual union all
8 select 123123, to_date('25.07.2019 04:05', 'dd.mm.yyyy hh24:mi'), to_date('05.07.2019 00:00', 'dd.mm.yyyy hh24:mi') from dual
9 )
10 select id, col1, col2
11 from (select id, col1, col2,
12 row_number() over (partition by id, col1 order by id, col1 desc, col2 desc) rn
13 from test
14 )
15 where rn > 1
16 order by id, col1, col2;
ID COL1 COL2
---------- ---------------- ----------------
123123 2019-07-23 22:00 2019-07-04 00:00
123123 2019-07-23 22:00 2019-07-05 00:00
123123 2019-07-25 04:05 2019-07-04 00:00
123123 2019-07-25 04:05 2019-07-05 00:00
或者(更糟糕的是,它会从同一个表中提取两次)
<snip>
10 select * from test t
11 where (t.id, t.col1, t.col2) not in
12 (select t1.id, max(t1.col1), max(t1.col2)
13 from test t1
14 where t1.id = t.id
15 group by t1.id, t1.col1
16 )
17 order by t.id, t.col1, t.col2;
ID COL1 COL2
---------- ---------------- ----------------
123123 2019-07-23 22:00 2019-07-04 00:00
123123 2019-07-23 22:00 2019-07-05 00:00
123123 2019-07-25 04:05 2019-07-04 00:00
123123 2019-07-25 04:05 2019-07-05 00:00
SQL>