Oracle之分析函数例子 - 高频数获取
2017-11-05 16:50
330 查看
drop table emp purge;
CREATE TABLE emp
(
emp_id NUMBER(6),
ename VARCHAR2(45),
dept_id NUMBER(4),
hire_date DATE,
sal NUMBER(8,2)
);
--创建emp数据
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (101, 'Tom', 20, TO_DATE('21-09-1989', 'DD-MM-YYYY'), 2000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (102, 'Mike', 20, TO_DATE('13-01-1993', 'DD-MM-YYYY'), 8000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (120, 'John', 50, TO_DATE('18-07-1996', 'DD-MM-YYYY'), 1000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (121, 'Joy', 50, TO_DATE('10-04-1997', 'DD-MM-YYYY'), 4000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (122, 'Rich', 50, TO_DATE('01-05-1995', 'DD-MM-YYYY'), 4000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (123, 'Kate', 50, TO_DATE('10-10-1997', 'DD-MM-YYYY'), 4000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (124, 'Jess', 50, TO_DATE('16-11-1999', 'DD-MM-YYYY'), 6000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (100, 'Stev', 10, TO_DATE('01-01-1990', 'DD-MM-YYYY'), 7000);
COMMIT;
set linesize 2000
set pagesize 2000
col emp_id format 999
col dept_id format 99
col sal format 9999
col ename format a5
col hire_date FORMAT DATE
SQL> select * from emp;
EMP_ID ENAME DEPT_ID HIRE_DATE SAL
---------- ---------------------- -------------- ----------
101 Tom 20 21-9月 -89 2000
102 Mike 20 13-1月 -93 8000
120 John 50 18-7月 -96 1000
121 Joy 50 10-4月 -97 4000
122 Rich 50 01-5月 -95 4000
123 Kate 50 10-10月-97 4000
124 Jess 50 16-11月-99 6000
100 Stev 10 01-1月 -90 7000
--出现频率最高的工资水平是多少
--分析:
SELECT sal,COUNT(*) repeat_num
FROM emp
GROUP BY sal;
SAL REPEAT_NUM
---------- ----------
1000 1
4000 3
2000 1
8000 1
6000 1
7000 1
--
SET autotrace ON
SET linesize 1000
SET pagesize 2000
SELECT sal
FROM
(
SELECT sal,RANK() OVER(ORDER BY repeat_num DESC) rank_repeat_num
FROM
(
SELECT sal,COUNT(*) repeat_num
FROM emp
GROUP BY sal
)
)
WHERE rank_repeat_num=1;
SAL
-----
4000
用分析函数写法的
4000
执行计划
----------------------------------------------------------
Plan hash value: 214435687
---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8 | 208 | 5 (40)| 00:00:01 |
|* 1 | VIEW | | 8 | 208 | 5 (40)| 00:00:01 |
|* 2 | WINDOW SORT PUSHED RANK| | 8 | 104 | 5 (40)| 00:00:01 |
| 3 | HASH GROUP BY | | 8 | 104 | 5 (40)| 00:00:01 |
| 4 | TABLE ACCESS FULL | EMP | 8 | 104 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RANK_REPEAT_NUM"=1)
2 - filter(RANK() OVER ( ORDER BY COUNT(*) DESC )<=1)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
7 consistent gets
0 physical reads
0 redo size
418 bytes sent via SQL*Net to client
415 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
---不用分析函数,写法比较麻烦,很繁琐
select sal
from (SELECT sal, COUNT(*) as repeat_num FROM emp GROUP BY sal) t
where t.repeat_num =
(select max(repeat_num)
from (SELECT sal, COUNT(*) as repeat_num FROM emp GROUP BY sal));
SAL
-----
4000
用普通写法的执行计划
-----------------------------------------------------------------------------
Plan hash value: 3118377657
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8 | 104 | 4 (25)| 00:00:01 |
|* 1 | FILTER | | | | | |
| 2 | HASH GROUP BY | | 8 | 104 | 4 (25)| 00:00:01 |
| 3 | TABLE ACCESS FULL | EMP | 8 | 104 | 3 (0)| 00:00:01 |
| 4 | SORT AGGREGATE | | 1 | 13 | | |
| 5 | VIEW | | 8 | 104 | 4 (25)| 00:00:01 |
| 6 | SORT GROUP BY | | 8 | 104 | 4 (25)| 00:00:01 |
| 7 | TABLE ACCESS FULL| EMP | 8 | 104 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(COUNT(*)= (SELECT MAX("REPEAT_NUM") FROM (SELECT "SAL"
"SAL",COUNT(*) "REPEAT_NUM" FROM "EMP" "EMP" GROUP BY "SAL")
"from$_subquery$_003"))
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
14 consistent gets
0 physical reads
0 redo size
418 bytes sent via SQL*Net to client
415 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
CREATE TABLE emp
(
emp_id NUMBER(6),
ename VARCHAR2(45),
dept_id NUMBER(4),
hire_date DATE,
sal NUMBER(8,2)
);
--创建emp数据
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (101, 'Tom', 20, TO_DATE('21-09-1989', 'DD-MM-YYYY'), 2000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (102, 'Mike', 20, TO_DATE('13-01-1993', 'DD-MM-YYYY'), 8000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (120, 'John', 50, TO_DATE('18-07-1996', 'DD-MM-YYYY'), 1000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (121, 'Joy', 50, TO_DATE('10-04-1997', 'DD-MM-YYYY'), 4000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (122, 'Rich', 50, TO_DATE('01-05-1995', 'DD-MM-YYYY'), 4000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (123, 'Kate', 50, TO_DATE('10-10-1997', 'DD-MM-YYYY'), 4000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (124, 'Jess', 50, TO_DATE('16-11-1999', 'DD-MM-YYYY'), 6000);
INSERT INTO emp (emp_id, ename, dept_id, hire_date, sal) VALUES (100, 'Stev', 10, TO_DATE('01-01-1990', 'DD-MM-YYYY'), 7000);
COMMIT;
set linesize 2000
set pagesize 2000
col emp_id format 999
col dept_id format 99
col sal format 9999
col ename format a5
col hire_date FORMAT DATE
SQL> select * from emp;
EMP_ID ENAME DEPT_ID HIRE_DATE SAL
---------- ---------------------- -------------- ----------
101 Tom 20 21-9月 -89 2000
102 Mike 20 13-1月 -93 8000
120 John 50 18-7月 -96 1000
121 Joy 50 10-4月 -97 4000
122 Rich 50 01-5月 -95 4000
123 Kate 50 10-10月-97 4000
124 Jess 50 16-11月-99 6000
100 Stev 10 01-1月 -90 7000
--出现频率最高的工资水平是多少
--分析:
SELECT sal,COUNT(*) repeat_num
FROM emp
GROUP BY sal;
SAL REPEAT_NUM
---------- ----------
1000 1
4000 3
2000 1
8000 1
6000 1
7000 1
--
SET autotrace ON
SET linesize 1000
SET pagesize 2000
SELECT sal
FROM
(
SELECT sal,RANK() OVER(ORDER BY repeat_num DESC) rank_repeat_num
FROM
(
SELECT sal,COUNT(*) repeat_num
FROM emp
GROUP BY sal
)
)
WHERE rank_repeat_num=1;
SAL
-----
4000
用分析函数写法的
4000
执行计划
----------------------------------------------------------
Plan hash value: 214435687
---------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8 | 208 | 5 (40)| 00:00:01 |
|* 1 | VIEW | | 8 | 208 | 5 (40)| 00:00:01 |
|* 2 | WINDOW SORT PUSHED RANK| | 8 | 104 | 5 (40)| 00:00:01 |
| 3 | HASH GROUP BY | | 8 | 104 | 5 (40)| 00:00:01 |
| 4 | TABLE ACCESS FULL | EMP | 8 | 104 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RANK_REPEAT_NUM"=1)
2 - filter(RANK() OVER ( ORDER BY COUNT(*) DESC )<=1)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
7 consistent gets
0 physical reads
0 redo size
418 bytes sent via SQL*Net to client
415 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
---不用分析函数,写法比较麻烦,很繁琐
select sal
from (SELECT sal, COUNT(*) as repeat_num FROM emp GROUP BY sal) t
where t.repeat_num =
(select max(repeat_num)
from (SELECT sal, COUNT(*) as repeat_num FROM emp GROUP BY sal));
SAL
-----
4000
用普通写法的执行计划
-----------------------------------------------------------------------------
Plan hash value: 3118377657
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 8 | 104 | 4 (25)| 00:00:01 |
|* 1 | FILTER | | | | | |
| 2 | HASH GROUP BY | | 8 | 104 | 4 (25)| 00:00:01 |
| 3 | TABLE ACCESS FULL | EMP | 8 | 104 | 3 (0)| 00:00:01 |
| 4 | SORT AGGREGATE | | 1 | 13 | | |
| 5 | VIEW | | 8 | 104 | 4 (25)| 00:00:01 |
| 6 | SORT GROUP BY | | 8 | 104 | 4 (25)| 00:00:01 |
| 7 | TABLE ACCESS FULL| EMP | 8 | 104 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(COUNT(*)= (SELECT MAX("REPEAT_NUM") FROM (SELECT "SAL"
"SAL",COUNT(*) "REPEAT_NUM" FROM "EMP" "EMP" GROUP BY "SAL")
"from$_subquery$_003"))
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
14 consistent gets
0 physical reads
0 redo size
418 bytes sent via SQL*Net to client
415 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
1 rows processed
相关文章推荐
- Oracle之分析函数 - 各种分析函数例子
- ORACLE分析函数的应用例子1 over partition by
- oracle的分析函数over(Partition by...)
- ORACLE 分析函数(转)
- 介绍oracle分析函数
- oracle的分析函数over(Partition by...) 及开窗函数
- Oracle中的函数例子
- 【转】oracle的分析函数over
- ORACLE函数介绍第六篇 著名函数之分析函数
- Oracle12C--分析函数(十四)
- 常用Oracle分析函数
- Oracle 分析函数详解
- Oracle分析函数
- Windows系统调用架构分析—也谈KiFastCallEntry函数地址的获取
- 超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数
- oracle中LAG()和LEAD()等分析统计函数的使用方法(统计月增长率)
- oracle分析函数学习
- oracle分析函数执行顺序
- Oracle开发专题之:分析函数(OVER)
- oracle/mysql 分析函数