Oracle SQL选择不同的查询以返回特定的行数

joa*_*erl 1 sql oracle distinct query-optimization rownum

我在Oracle数据库中有一个表,其中包含时间戳列nextTime和字符串列destName.还有更多列,但在这种情况下只有这两个列相关.我正在尝试设计一个查询,它将在特定的时间间隔内返回具有nextTime的不同destName,并且返回的行数应该最多为1000.当区间内有超过一千个不同的destName时,我希望查询返回一千行,而不是更多或更少.

我实际上有一个正在运行的查询,但它太慢了:

select destName 
from (select /*+ index(tblDestNames tbldestnames_destname)*/ distinct destName
from (select /*+ index(tblDestNames tbldestnames_nextTime)*/ destName
from tblDestNames 
where nextTime < :1 and nextTime >= :2 and destName is not null)) 
where rownum <= 1000; 
Run Code Online (Sandbox Code Playgroud)

关于如何设计更智能的查询或如何优化这种现有查询的任何想法都非常感谢.

Uph*_* '1 7

我不确定是否有理由不简化查询:

select destName 
from (
    select distinct destName
    from tblDestNames 
    where nextTime < :1 and nextTime >= :2 and destName is not null
    )
where rownum <= 1000; 
Run Code Online (Sandbox Code Playgroud)

但是,这不会解决您的性能问题.问题是这样的:

where rownum <= 1000
Run Code Online (Sandbox Code Playgroud)

通过用'rank'和'over'替换rownum,你会得到类似的东西:

select distinct destName
from (
    select
       destName
    from
       (select destName, rank()
        over (order by destName desc ) rnk
        from tblDestNames
        where nextTime < :1 and nextTime >= :2 and destName is not null) 
    where rnk <= 1000;
    )
Run Code Online (Sandbox Code Playgroud)

奖励是,在"结束"时,您选择将显示的结果的顺序和不显示的结果的顺序.

编辑:实际上它可以进一步简化为:

select
   distinct destName
from
   (select destName, rank()
    over (order by destName desc ) rnk
    from tblDestNames
    where nextTime < :1 and nextTime >= :2 and destName is not null) 
where rnk <= 1000;
Run Code Online (Sandbox Code Playgroud)