我有一个表user_audit_records_tbl,它有多个行供单个用户使用,每次用户登录一个条目都进入此表,所以我想要一个选择查询,它将为每个用户获取最新的单个记录,我有一个查询它使用IN子句。
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);
但只是想知道是否有人有更好的解决方案,因为这张桌子有很大的数量。
答案 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
;