首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle SQL -如何检索列的最高5个值

Oracle SQL -如何检索列的最高5个值
EN

Stack Overflow用户
提问于 2010-02-22 01:44:27
回答 5查看 54.6K关注 0票数 17

如何编写一个查询,其中只返回具有最高列值或最低列值的选定行数。

例如,一份包含5个最高收入员工的报告?

EN

回答 5

Stack Overflow用户

发布于 2010-02-22 01:59:18

最好的方法是使用分析函数,RANK()或DENSE_RANK()……

代码语言:javascript
复制
SQL> select * from (
  2        select empno
  3               , sal
  4               , rank() over (order by sal desc) as rnk
  5        from emp)
  6  where rnk <= 5
  7  /

     EMPNO        SAL        RNK
---------- ---------- ----------
      7839       5000          1
      7788       3000          2
      7902       3000          2
      7566       2975          4
      8083       2850          5
      7698       2850          5

6 rows selected.

SQL>

当存在平局时,DENSE_RANK()会压缩间隙:

代码语言:javascript
复制
SQL> select * from (
  2        select empno
  3               , sal
  4               , dense_rank() over (order by sal desc) as rnk
  5        from emp)
  6  where rnk <= 5
  7  /

     EMPNO        SAL        RNK
---------- ---------- ----------
      7839       5000          1
      7788       3000          2
      7902       3000          2
      7566       2975          3
      8083       2850          4
      7698       2850          4
      8070       2500          5

7 rows selected.

SQL>

您更喜欢哪种行为取决于您的业务需求。

还有ROW_NUMBER()分析函数,我们可以使用它返回精确的行数。但是,我们应该避免使用基于行号的解决方案,除非业务逻辑乐于在平局中任意截断结果集。请求五个最高值与按高值排序的前五个记录之间存在差异

还有一个使用ROWNUM伪列的非解析解决方案。这很笨拙,因为ROWNUM是在ORDER BY子句之前应用的,这可能会导致意外的结果。很少有任何理由使用ROWNUM而不是ROW_NUMBER()或其中一个排名函数。

票数 26
EN

Stack Overflow用户

发布于 2010-02-22 01:46:20

试试这个:

代码语言:javascript
复制
SELECT * FROM 
    (SELECT field1, field2 FROM fields order by field1 desc) 
where rownum <= 5

也可以在this resource上查看有关rownum如何工作的更详细的描述。

票数 12
EN

Stack Overflow用户

发布于 2010-02-22 03:17:53

Oracle 9i+提供分析函数:

所有这些都需要使用OVER子句,该子句允许PARTITION BYORDER BY子句正确地调优返回的ROW_NUMBER/RANK/DENSE_RANK值。

在9i之前,唯一的选择是使用ROWNUM -顺便说一句,它比使用ROW_NUMBER (link)更快。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2306744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档