需求:找某个表的里按时间排序最大时间前每五条记录的值 全量找 时候,效率太低,数据有好多年的沉淀。
所以我想在SELECT里直接取,但需要用到两层套嵌,

select  (select * from (select * from dual a where a.dummy = b.dummy)) t
from dual b
这样b表的值 是传到子查询里的,
所以问问满足我的需求有什么其他的好办法吗

解决方案 »

  1.   

    表中大概有两千多万数据,有将近二十年的积累,我只要找最大日期的值 ,最新五天的值 ,结果大概只有二十万记录,
    如果全量用分析函数,太慢了,比直接在SELECT中取慢太多了
      

  2.   

    日期最近的第五条记录  是第五条记录吗,上面你说是最近5天的值,再看一楼你的代码,一个查询作为标量子查询难道返回的不是一个值吗,而是一个集合?是的,就是第五天,一楼的代码是不能执行的,会报错最开始的办法,是用ROW_NUMBER() over(parition by  order by ) 这种,然后用行列转换,取值为5的但这种分组排序,每组都要排上万个序号,而我只要取一个字,所以这样效率很差我是想有没有办法 直接走索引取第5个,在SELECT  子句中,这样的效率会高很多
      

  3.   

    日期最近的第五条记录  是第五条记录吗,上面你说是最近5天的值,再看一楼你的代码,一个查询作为标量子查询难道返回的不是一个值吗,而是一个集合?是的,就是第五天,一楼的代码是不能执行的,会报错最开始的办法,是用ROW_NUMBER() over(parition by  order by ) 这种,然后用行列转换,取值为5的但这种分组排序,每组都要排上万个序号,而我只要取一个字,所以这样效率很差我是想有没有办法 直接走索引取第5个,在SELECT  子句中,这样的效率会高很多对什么分组,是上面你说的【代码】 字段吗?
      

  4.   

    日期最近的第五条记录  是第五条记录吗,上面你说是最近5天的值,再看一楼你的代码,一个查询作为标量子查询难道返回的不是一个值吗,而是一个集合?是的,就是第五天,一楼的代码是不能执行的,会报错最开始的办法,是用ROW_NUMBER() over(parition by  order by ) 这种,然后用行列转换,取值为5的但这种分组排序,每组都要排上万个序号,而我只要取一个字,所以这样效率很差我是想有没有办法 直接走索引取第5个,在SELECT  子句中,这样的效率会高很多对什么分组,是上面你说的【代码】 字段吗?是的
      

  5.   

    日期最近的第五条记录  是第五条记录吗,上面你说是最近5天的值,再看一楼你的代码,一个查询作为标量子查询难道返回的不是一个值吗,而是一个集合?是的,就是第五天,一楼的代码是不能执行的,会报错最开始的办法,是用ROW_NUMBER() over(parition by  order by ) 这种,然后用行列转换,取值为5的但这种分组排序,每组都要排上万个序号,而我只要取一个字,所以这样效率很差我是想有没有办法 直接走索引取第5个,在SELECT  子句中,这样的效率会高很多对什么分组,是上面你说的【代码】 字段吗?是的
    可以优化。
    【代码】字段的distinct值大概有多少
      

  6.   

    这样改写试试(col_代码,col_日期  上复合索引):
    --原代码基本结构:
    select *
      from (select row_number() over(partition by col_代码 order by col_日期) rn,
                    a.*
               from tab a)
     where rn = 5;
    --改写:
    select *
      from tab a,
           (select rid
               from (select row_number() over(partition by col_代码 order by col_日期) rn,
                             rowid rid
                        from tab a)
              where rn = 5) b
     where a.rowid = b.rid;