Oracle的分析函数over

Oracle分析函数over的应用很广泛。

用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。

经常与sum,rank等函数同事出现。

例子:

soctt的emp表为例:需要获得每个部门的总的sal。则

SELECT empno, ename, deptno,SUM(sal) OVER(PARTITION BY deptno) AS  deptpn_sal FROM emp

结果如图:

1 7782 CLARK 10 8750
2 7839 KING 10 8750
3 7934 MILLER 10 8750
4 7566 JONES 20 10875
5 7902 FORD 20 10875
6 7876 ADAMS 20 10875
7 7369 SMITH 20 10875
8 7788 SCOTT 20 10875
9 7521 WARD 30 9400
10 7844 TURNER 30 9400
11 7499 ALLEN 30 9400
12 7900 JAMES 30 9400
13 7698 BLAKE 30 9400
14 7654 MARTIN 30 9400

如果需要按人员id进行累计,则

SELECT empno, ename, deptno,SUM(sal) OVER(PARTITION BY deptno ORDER BY empno) AS  deptpn_sal FROM emp

结果如下:

1 7782 CLARK 10 2450
2 7839 KING 10 7450
3 7934 MILLER 10 8750
4 7369 SMITH 20 800
5 7566 JONES 20 3775
6 7788 SCOTT 20 6775
7 7876 ADAMS 20 7875
8 7902 FORD 20 10875
9 7499 ALLEN 30 1600
10 7521 WARD 30 2850
11 7654 MARTIN 30 4100
12 7698 BLAKE 30 6950
13 7844 TURNER 30 8450
14 7900 JAMES 30 9400

rank 示例如下

SELECT empno, ename, deptno, sal,RANK() OVER(PARTITION BY deptno ORDER BY sal) AS  deptpn_sal FROM emp

结果

1 7934 MILLER 10 1300.00 1
2 7782 CLARK 10 2450.00 2
3 7839 KING 10 5000.00 3
4 7369 SMITH 20 800.00 1
5 7876 ADAMS 20 1100.00 2
6 7566 JONES 20 2975.00 3
7 7788 SCOTT 20 3000.00 4
8 7902 FORD 20 3000.00 4
9 7900 JAMES 30 950.00 1
10 7654 MARTIN 30 1250.00 2
11 7521 WARD 30 1250.00 2
12 7844 TURNER 30 1500.00 4
13 7499 ALLEN 30 1600.00 5
14 7698 BLAKE 30 2850.00 6

这里在提一下rank与row_number、dense_rank的区别

ROW_NUMBER

Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。

DENSE_RANK
Dense_rank函数返回一个唯一的值,除非当碰到相同数据时,此时所有相同数据的排名都是一样的。

RANK
Rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。

时间: 2024-10-28 13:12:55

Oracle的分析函数over的相关文章

Oracle 10gR2分析函数

Oracle 10gR2分析函数汇总 (Translated By caizhuoyi 2008‐9‐19) 说明:  1. 原文中底色为黄的部分翻译存在商榷之处,请大家踊跃提意见:  2. 原文中淡蓝色字体的文字,不宜翻译,保持原样.  1. ANALYTIC FUNCTIONS Analytic functions compute an aggregate value based on a group of rows. They differ from aggregate functions

oracle的分析函数over(Partition by...)

Sql代码 over(Partition by...) 一个超级牛皮的ORACLE特有函数. 最近工作中才接触到这个功能强大而灵活的函数. oracle的分析函数over 及开窗函数 一:分析函数over Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组只返回一行. 下面通过几个例子来说明其应用. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

Oracle的分析函数

Oracle的分析函数row_number(),rank(),dense_rank()的用法与区别 比如查询工资排名第7的员工信息,可以用分析函数来做. --查询工资排名第7的员工信息select *  from (select emp.*, rank() over(order by sal desc) rank from emp) where rank = 7; select *  from (select emp.*, dense_rank() over(order by sal desc)

ORACLE统计分析函数

本文讲述Oracle分析函数用法,首先建库: Sql代码   create table earnings -- 打工赚钱表 ( earnmonth varchar2(6), -- 打工月份 area varchar2(20), -- 打工地区 sno varchar2(10), -- 打工者编号 sname varchar2(20), -- 打工者姓名 times int, -- 本月打工次数 singleincome number(10,2), -- 每次赚多少钱 personincome n

oracle的分析函数over 及开窗函数

转:http://www.2cto.com/database/201310/249722.html 一:分析函数over Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组只返回一行. 下面通过几个例子来说明其应用. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

oracle 统计/分析函数

Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行. 语法: Sql代码 <analytic-function>(<argument>,<argument>,...)    over(    <query-partition-clause>    <order-by-clause>    <windowing-clause>    )

oracle 之分析函数 over (partition by ...order by ...)

一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行. 1.分析函数和聚合函数的不同之处: 分析函数和聚合函数很多是同名的,意思也一样,只是聚合函数用group by分组,每个分组返回一个统计值,而分析函数采用partition by分组,并且每组每行都可以返回一个统计值.简单的说就是聚合函数返回统计结果,分析函数返回明细加统计结果. (一).分析函数语法: FUNCTION_

oracle常用分析函数 over(partition by xxx order by xxx)

--over order by 连续累加的意思,把by后面相同的字段,一个组组累加起来SELECT id_,name_,proc_def_id_, count(*) over(order by name_) FROM ACT_RU_TASK --over partition by 分组统计 类似于group by,区别是它会列出重复的项,而group by只列出一条SELECT id_,name_,proc_def_id_, count(*) over(partition by name_) F

Oracle 中的分析函数

Oracle常用分析函数介绍(排名函数+窗口函数) 2014年11月30日 ? 数据库 ? 共 3903字 ? 暂无评论 ? 阅读 7,772 次 评级函数 常见评级函数如下: RANK():返回数据项在分组中的排名,在排名相等时会在名次中留下空位,造成排名不连续. DENSE_RANK():同样返回数据项在分组中排名,不过在排名相等时不会留下名位空位. CUME_DIST():返回特定值相对于一组值的位置,是累积分布(cumulative distribution)的简写. PERCENT_R