[英]How to select middle 80% rows in Oracle SQL with order by (top % is not working)
I tried top % but that is not working in Oracle SQL.我尝试了 top % 但这在 Oracle SQL 中不起作用。 Offset and fetch next are working but I am not able to give percentage.
Offset 和 fetch next 正在工作,但我无法给出百分比。
What will be the best way to fetch middle 80% rows?获取中间 80% 行的最佳方法是什么?
Any help will be appreciated, thanks!任何帮助将不胜感激,谢谢!
Middle 80% ?中间 80% ? That's between 10 and 90%, then?
那是在 10% 到 90% 之间? Let's suppose it is.
让我们假设它是。
Sample data (Scott's EMP
table), sorted by salary:样本数据(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 ranks employees by their salaries; CTE根据员工的薪水对员工进行排名; the final
where
clause returns rows for those of them who fall into that "middle" 80% (the pct
column).最后的
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.