首页 > 解决方案 > 如何使用 order by 在 Oracle SQL 中选择中间 80% 行(top % 不起作用)

问题描述

我尝试了 top % 但这在 Oracle SQL 中不起作用。Offset 和 fetch next 正在工作,但我无法给出百分比。

获取中间 80% 行的最佳方法是什么?

任何帮助将不胜感激,谢谢!

标签: sqloracle

解决方案


中间 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>

推荐阅读