如何编写一个查询,其中只返回最多或最低列值的选定行数.
即有五名最高工资的雇员的报告?
最好的方法是使用分析函数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,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()或其中一个排名函数.