分析函式之排名統計
IDLE > conn scott/tiger
Connected.
SCOTT:159@hongye > select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
7566 JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
7782 CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
7839 KING PRESIDENT 1981-11-17 00:00:00 5000 10
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
7876 ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
7900 JAMES CLERK 7698 1981-12-03 00:00:00 950 30
7902 FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
7934 MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
14 rows selected.
例子1、rank 和 和 dense_rank 函式
rank 函式統計排名,會跳過重複的排名,比如有2個第一名,那麼下一個就是第三名了
dense_rank函式則不會跳過,如果有2個第一名,其下一個依然還是第2名。
SCOTT:159@hongye > select deptno,sum(sal),rank() over (order by sum(sal)) as rank,dense_rank() over (order by sum(sal)) as dense_rank from emp group by deptno;
DEPTNO SUM(SAL) RANK DENSE_RANK
---------- ---------- ---------- ----------
10 8750 1 1
30 9400 2 2
20 10875 3 3
排序的順序(升序或者降序)也是可以控制的
SCOTT:159@hongye > select deptno,sum(sal),rank() over (order by sum(sal) desc) as rank,dense_rank() over (order by sum(sal)) as dense_rank from emp group by deptno;
DEPTNO SUM(SAL) RANK DENSE_RANK
---------- ---------- ---------- ----------
10 8750 3 1
30 9400 2 2
20 10875 1 3
例子2、cume_dist 和 percent_rank 函式
cume_dist 返回該條記錄在分組中的位置,比如1/3、2/3、1
percent_rank 返回的是一條記錄在分組紅的百分比排名,從0開始,比如0、0.5、1
SCOTT:159@hongye > select deptno,sum(sal),cume_dist() over(order by sum(sal)) as cume_dist,percent_rank() over (order by sum(sal)) as per_rank from emp group by deptno;
DEPTNO SUM(SAL) CUME_DIST PER_RANK
---------- ---------- ---------- ----------
10 8750 .333333333 0
30 9400 .666666667 .5
20 10875 1 1
在emp表中增加一個部門繼續後續的實驗。
SCOTT:159@hongye > create table t as select empno,ename,job,mgr,sal,deptno from emp;
Table created.
SCOTT:159@hongye > insert into t values(1111,'HONGYE','MANAGER',7839,10000,40);
1 row created.
SCOTT:159@hongye > insert into t values(2222,'DBA','ANALYST',1111,8888,40);
1 row created.
SCOTT:159@hongye > select * from t;
EMPNO ENAME JOB MGR SAL DEPTNO
---------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 800 20
7499 ALLEN SALESMAN 7698 1600 30
7521 WARD SALESMAN 7698 1250 30
7566 JONES MANAGER 7839 2975 20
7654 MARTIN SALESMAN 7698 1250 30
7698 BLAKE MANAGER 7839 2850 30
7782 CLARK MANAGER 7839 2450 10
7788 SCOTT ANALYST 7566 3000 20
7839 KING PRESIDENT 5000 10
7844 TURNER SALESMAN 7698 1500 30
7876 ADAMS CLERK 7788 1100 20
7900 JAMES CLERK 7698 950 30
7902 FORD ANALYST 7566 3000 20
7934 MILLER CLERK 7782 1300 10
1111 HONGYE MANAGER 7839 10000 40
2222 DBA ANALYST 1111 8888 40
16 rows selected.
例子3、ntile 函式
ntile(buckets),將所在的分組再分成 bucket 個片段,計算每個片段的排名
如下:2分片
SCOTT:159@hongye > select deptno,sum(sal),ntile(2) over(order by sum(sal)) as ntile from t group by deptno;
DEPTNO SUM(SAL) NTILE
---------- ---------- ----------
10 8750 1
30 9400 1
20 10875 2
40 18888 2
如下:3分片
SCOTT:159@hongye > select deptno,sum(sal),ntile(3) over(order by sum(sal)) as ntile from t group by deptno;
DEPTNO SUM(SAL) NTILE
---------- ---------- ----------
10 8750 1
30 9400 1
20 10875 2
40 18888 3
如下:4分片
SCOTT:159@hongye > select deptno,sum(sal),ntile(4) over(order by sum(sal)) as ntile from t group by deptno;
DEPTNO SUM(SAL) NTILE
---------- ---------- ----------
10 8750 1
30 9400 2
20 10875 3
40 18888 4
例子4、使用row_number函式
row_number 函式從1開始,為每個分組記錄返回一個遞增的數字
SCOTT:159@hongye > select deptno,sum(sal),row_number() over(order by sum(sal)) as ntile from t group by deptno;
DEPTNO SUM(SAL) NTILE
---------- ---------- ----------
10 8750 1
30 9400 2
20 10875 3
40 18888 4
如下:倒序的 row_number
SCOTT:159@hongye > select deptno,sum(sal),row_number() over(order by sum(sal) desc) as ntile from t group by deptno;
DEPTNO SUM(SAL) NTILE
---------- ---------- ----------
40 18888 1
20 10875 2
30 9400 3
10 8750 4
SCOTT:159@hongye >
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24465008/viewspace-690006/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分析函式——統計函式
- oracle 統計分析函式Oracle函式
- 排名前100的PHP函式及分析PHP函式
- 【Analytic】分析函式之MIN函式函式
- 【Analytic】分析函式之MAX函式函式
- 【Analytic】分析函式之AVG函式函式
- 【Analytic】分析函式之RANK函式函式
- 【Analytic】分析函式之COUNT函式函式
- 【分析函式】Oracle分析函式之LAG和LEAD函式Oracle
- 不使用分析函式的累計統計查詢函式
- 【Analytic】分析函式之ROW_NUMBER函式函式
- 【Analytic】分析函式之DENSE_RANK函式函式
- 【Analytic】分析函式之FIRST_VALUE函式函式
- 【Analytic】分析函式之LAST_VALUE函式函式AST
- 分析函式之視窗子句函式
- Oracle分析函式之開窗函式over()詳解Oracle函式
- MySQL排名函式實現MySql函式
- PHP函式漏洞審計之addslashes函式-PHP函式
- Spark2 Dataset分析函式--排名函式row_number,rank,dense_rank,percent_rankSpark函式
- 【實驗】分析函式之魅力展示函式
- Linux系統程式設計(9)—— 程式之程式控制函式exec系列函式Linux程式設計函式
- Oracle分析函式、多維函式和Model函式簡要說明,主要針對BI報表統計Oracle函式
- Sql Server函式全解(五)之系統函式SQLServer函式
- Oracle分析函式七——分析函式案例Oracle函式
- Oracle統計分析函式集,over(partition by..) 的運用Oracle函式
- oracle分析函式之ratio_to_reportOracle函式
- Oracle聚合函式/分析函式Oracle函式
- 分析函式函式
- 【筆記】oracle 統計函式筆記Oracle函式
- 作業系統---之fork()函式作業系統函式
- 字串函式之Strtok()函式字串函式
- redux原始碼分析之四:compose函式Redux原始碼函式
- linux系統程式設計之程式(七):system()函式使用Linux程式設計函式
- oracle中LAG()和LEAD()等分析統計函式的用法(統計月增長率)Oracle函式
- 機器學習之統計分析(2)機器學習
- 機器學習之統計分析(1)機器學習
- 分析函式概述函式
- 分析函式 over函式