我使用 Oracle 作为 DBMS 并且有一个大表(400,000,000 条记录)。现在,我想检索每个类别的最后一条记录。当我使用如下所示的“group by”时,需要很长时间。有没有更快的方法?
注意:我需要检索所有表的数据:
select *
from myTable tb1
inner join
(select MAX(id) max_id, categoryColumn
from myTable
group by categoryColumn) tb2 on tb1.id = tb2.max_id
您可以尝试窗口函数:
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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句