如何检索每个类别的最后一条记录(更快的方式)

How to retrieve last record of each category( faster way )

我使用 Oracle 作为 DBMS,并且有一个很大的 table(400,000,000 条记录)。现在,我想检索每个类别的最后一条记录。当我如下所示使用 "group by" 时,需要很长时间。有没有更快的方法?

注意:我需要检索所有 table 的数据:

select * 
from myTable tb1
inner join 
    (select MAX(id) max_id, categoryColumn 
     from myTable 
     group by categoryColumn) tb2 on tb1.id = tb2.max_id

您可以尝试 window 功能:

select t.*
from (select t.*, 
             row_number() over (partition by categoryColumn order by id desc) as seqnum
      from mytable t
     ) t
where seqnum = 1;

我会推荐 (categoryColumn, id desc) 上的索引。

有了这个索引,您可能会发现相关子查询更快:

select t.*
from mytable t
where t.id = (select max(t2.id)
              from mytable t2
              where t2.categoryColumn = t.categoryColumn
             );

虽然我认为上面的速度更快,但我使用 keep 的性能很好。语法比较繁琐:

select categoryColumn, max(id) as id,
       max(col1) keep (dense_rank first order by id desc) as col1,
       max(col2) keep (dense_rank first order by id desc) as col2,
       . . .  -- and so on for each column
from mytable t
group by categoryColumn;