从表

时间:2016-10-23 14:27:38

标签: sql oracle oracle10g greatest-n-per-group

这是目录表:

enter image description here

我必须从这张表中找到第三高的成本。

我写了这个:

 SELECT TOP 1 COST FROM CATALOG WHERE COST IN
 (SELECT DISTINCT TOP 3 COST FROM CATALOG ORDER BY COST DESC)
 ORDER BY COST ASC;

我收到了这个错误:

  

未找到预期的关键字

2 个答案:

答案 0 :(得分:1)

Oracle无法识别TOP。您可以执行您想要的操作,但它需要额外的子查询(除非您使用的是Oracle 12c +):

SELECT MIN(COST)
FROM CATALOG
WHERE COST IN (SELECT COST
               FROM (SELECT DISTINCT COST
                     FROM CATALOG
                     ORDER BY COST DESC
                    ) c
               WHERE rownum <= 3
              );

注意:尽管可能很诱人,但您不能在子查询中使用WHERE rownum = 3。您可以查看文档以获取解释,但基本上rownum不会增加,直到在结果集中放置一行。因此,rownum = 1 总是需要在结果集中。

最后,在任何(合理的)数据库中执行此操作的常规方法是使用dense_rank()

select c.*
from (select c.*, dense_rank() over (order by cost desc) as seqnum
      from category c
     ) c
where seqnum = 3;

答案 1 :(得分:0)

如果您使用的是Oracle 12c +,请使用OFFSET

SELECT COST 
FROM   CATALOG 
ORDER BY COST 
OFFSET 3 ROWS FETCH NEXT 1 ROWS ONLY;