从oracle表中的重复行中获取单个记录

时间:2015-08-18 06:32:22

标签: oracle

我有一个表user_audit_records_tbl,它有多个行供单个用户使用,每次用户登录一个条目都进入此表,所以我想要一个选择查询,它将为每个用户获取最新的单个记录,我有一个查询它使用IN子句。

表名:user_audit_records_tbl

Record_id Number Primary Key,
user_id varchar Primary Key ,
user_ip varchar,
.
.
etc

我正在使用的当前查询是

  

从user_audit_records_tbl中选择*其中record_id in(选择   来自user_audit_records_tbl的max(record_id)       group by user_id);

但只是想知道是否有人有更好的解决方案,因为这张桌子有很大的数量。

2 个答案:

答案 0 :(得分:1)

您可以使用第一个/最后一个功能

select max(Record_id) as Record_id,
       user_id, 
       max(user_ip) keep (dense_rank last order by record_id) as user_ip, 
       ...
from user_audit_records_tbl 
group by user_id

不确定它是否会更有效率。

编辑:由于上述查询效率较低,您可以尝试使用exists子句

select * 
from user_audit_records_tbl A
where exists    (    select 1
                    from user_audit_records_tbl B
                    where A.user_id = B.user_id
                    group by B.user_id
                    having max(B.record_id) = A.record_id
                )

但也许,您应该查看索引端而不是查询端。

答案 1 :(得分:1)

select * 
from ( select row_number() over ( partition by user_id order by record_id desc) row_nr,
              a.*
       from user_audit_records_tbl  a 
     ) 
where row_nr = 1
;