为了账号安全,请及时绑定邮箱和手机立即绑定

Oracle SQL-如何检索列的前5个值

Oracle SQL-如何检索列的前5个值

aluckdog 2019-11-04 09:28:27
如何编写查询,其中仅返回具有最高或最低列值的选定行数。例如,一份薪水最高的5位员工的报告?
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

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


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()压缩间隙:


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伪列的非解析解决方案。这很笨拙,因为在ORDER BY子句之前应用了ROWNUM,这可能导致意外结果。几乎没有任何理由使用ROWNUM而不是ROW_NUMBER()或排名函数之一。


查看完整回答
反对 回复 2019-11-04
?
www说

TA贡献1775条经验 获得超8个赞

试试这个:


SELECT * FROM 

    (SELECT field1, field2 FROM fields order by field1 desc) 

where rownum <= 5

还请查看该资源,以获取有关rownum工作原理的更详细描述。


查看完整回答
反对 回复 2019-11-04
?
月关宝盒

TA贡献1772条经验 获得超5个赞

在Oracle 12c中,可以使用FETCH..FIRST ROWS..ONLY


获取前5名最高薪水。


 SELECT *

       FROM EMPLOYEES

   ORDER BY SALARY DESC

FETCH FIRST 5 ROWS ONLY;


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 867 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信