Как насчет этого?
SQL> with test (uname, event, tstamp) as
2 (select 'user1', 3, date '2019-09-10' from dual union all
3 select 'user1', 9, date '2019-09-14' from dual union all
4 select 'user1', 32, date '2019-08-14' from dual union all
5 select 'user1', 21, date '2019-08-20' from dual union all
6 select 'user1', 8, date '2019-08-23' from dual union all
7 --
8 select 'user2', 3, date '2019-09-05' from dual union all
9 select 'user2', 9, date '2019-08-14' from dual union all
10 select 'user2', 8, date '2019-08-23' from dual union all
11 --
12 select 'user3', 15, date '2019-08-06' from dual union all
13 select 'user3', 1, date '2019-08-30' from dual union all
14 select 'user3', 7, date '2019-09-14' from dual
15 )
16 select t.uname,
17 max(case when (select max(1) from test t1
18 where t1.uname = t.uname
19 and t1.event = 21
20 ) = 1 then 21
21 else t.event
22 end) event,
23 max(t.tstamp) tstamp
24 from test t
25 group by t.uname
26 order by t.uname;
UNAME EVENT TSTAMP
----- ---------- ----------------
user1 21 2019-09-14 00:00
user2 9 2019-09-05 00:00
user3 15 2019-09-14 00:00
SQL>
Если есть event = 21
, оно будет возвращено.Если нет, то будет возвращено событие MAX
(что так же хорошо, как и любое другое значение, как вы сказали, что вас это не волнует) вместе с MAX
tstamp
для каждого uname
.