sql - 如何使用 order by 在 Oracle SQL 中选择中间 80% 行(top % 不起作用)
问题描述
我尝试了 top % 但这在 Oracle SQL 中不起作用。Offset 和 fetch next 正在工作,但我无法给出百分比。
获取中间 80% 行的最佳方法是什么?
任何帮助将不胜感激,谢谢!
解决方案
中间 80% ? 那是在 10% 到 90% 之间?让我们假设它是。
样本数据(Scott 的EMP
表),按薪水排序:
SQL> select ename, job, sal,
2 rank() over (order by sal) rnk
3 from emp order by sal;
ENAME JOB SAL RNK
---------- --------- ---------- ----------
SMITH CLERK 800 1
JAMES CLERK 950 2
ADAMS CLERK 1100 3
WARD SALESMAN 1250 4
MARTIN SALESMAN 1250 4
MILLER CLERK 1300 6
TURNER SALESMAN 1500 7
ALLEN SALESMAN 1600 8
CLARK MANAGER 2450 9
BLAKE MANAGER 2850 10
JONES MANAGER 2975 11
SCOTT ANALYST 3000 12
FORD ANALYST 3000 12
KING PRESIDENT 5000 14
14 rows selected.
CTE根据员工的薪水对员工进行排名;最后一个where
子句为那些属于“中间”80%(pct
列)的人返回行。
SQL> with temp as
2 (select ename, job, sal,
3 rank() over (order by sal) rnk, -- rank rows by salary
4 count(*) over (order by null) cnt -- total number of rows
5 from emp
6 )
7 select t.*,
8 round(rnk / cnt * 100) pct -- percentage
9 from temp t
10 where round(rnk / cnt * 100) between 10 and 90;
ENAME JOB SAL RNK CNT PCT
---------- --------- ---------- ---------- ---------- ----------
JAMES CLERK 950 2 14 14
ADAMS CLERK 1100 3 14 21
WARD SALESMAN 1250 4 14 29
MARTIN SALESMAN 1250 4 14 29
MILLER CLERK 1300 6 14 43
TURNER SALESMAN 1500 7 14 50
ALLEN SALESMAN 1600 8 14 57
CLARK MANAGER 2450 9 14 64
BLAKE MANAGER 2850 10 14 71
JONES MANAGER 2975 11 14 79
SCOTT ANALYST 3000 12 14 86
FORD ANALYST 3000 12 14 86
12 rows selected.
SQL>
推荐阅读
- angularjs - AngularJS Nvd3 图表 - 在每个 statechange 上调用回调
- matlab - 插值分散的 3D 电场数据
- vba - 将选择扩展到最后使用的列 vba
- javascript - 同一页面 CORB 在一个实例中被阻止,但在另一个实例中没有
- php - Lumen 5.6 Migrate Error Specified key was too long max key length is 767 bytes
- c++ - 在 Windows 上制作期间未定义 Qt vulkan 类
- java - java.net.ProtocolException:设置 CookieHandler 时不起作用
- javascript - 如何在谷歌地理编码调用中传递一些参数
- python - 如何更新使用 joblib 保存的经过训练的朴素贝叶斯模型
- linux - 如何使用时间戳显示历史记录