- AVG函数的语法描述
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions011.htm#SQLRF00609
AVG([ DISTINCT | ALL ] expr)
[ OVER(analytic_clause) ]
- 具体问题具体分析,在统计分析报表系统中AVG分析函数用处颇大。
- 有关分析函数的扩展可以参考Oracle的官方文档中的“Analytic Functions”描述:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions001.htm#SQLRF06174
- 通过实验看一下两种AVG函数的用法和区别
-- 创建测试表T,并初始化几条数据
create table t (group_id number(10), name varchar2(10), salary int);
insert into t values (1,'Tom',1200);
insert into t values (2,'Kary',2400);
insert into t values (2,'Joe',800);
insert into t values (3,'Erick',3600);
insert into t values (3,'Andy',600);
insert into t values (3,'Mary',300);
commit;
-- T表全貌
-- 共三组数据,group_id分别是1、2和3。第1组有一个人,第2组有两个人,第3组有三个人。最后一列是每个人的薪水值
select * from t;
GROUP_ID NAME SALARY
---------- ------------------------------ ----------
1 Tom 1200
2 Kary 2400
2 Joe 800
3 Erick 3600
3 Andy 600
3 Mary 300
6 rows selected.
-- 普通AVG函数的用法
-- 得到的平均值是按照“group_id, name, salary”三列进行分组后的每组平均值
select group_id, name, salary, avg(salary) from t group by group_id, name, salary order by group_id;
GROUP_ID NAME SALARY AVG(SALARY)
---------- ------------------------------ ---------- -----------
1 Tom 1200 1200
2 Joe 800 800
2 Kary 2400 2400
3 Andy 600 600
3 Erick 3600 3600
3 Mary 300 300
6 rows selected.
-- 再看一下分析函数AVG得到的平均值
-- 注意这里得到的平均值与基本AVG函数得到的平均值区别,这里的平均值是每行记录所对应组内的平均薪酬值
select group_id, name, salary, avg(salary) over (partition by group_id) analytic_avg from t order by group_id;
GROUP_ID NAME SALARY ANALYTIC_AVG
---------- ------------------------------ ---------- ------------
1 Tom 1200 1200
2 Kary 2400 1600
2 Joe 800 1600
3 Erick 3600 1500
3 Andy 600 1500
3 Mary 300 1500
6 rows selected.
-- 进一步限定一下计算的范围
-- 此时得到的薪酬值是每行记录与其之前的记录和其之后的记录三者的平均值
-- 注意头和尾的平均值计算方法
-- 头:组内第一条记录与第二条记录的和除以二得到第一条记录的平均值
-- 尾:组内最后一条记录与倒数第二条记录的和除以二得到最后一条记录的平均值
select group_id, name, salary, avg(salary) over (partition by group_id order by name rows between 1 preceding and 1 following) analytic_avg from t order by group_id;
GROUP_ID NAME SALARY ANALYTIC_AVG
---------- ------------------------------ ---------- ------------
1 Tom 1200 1200
2 Joe 800 1600
2 Kary 2400 1600
3 Andy 600 2100
3 Erick 3600 1500
3 Mary 300 1950
6 rows selected.
http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions011.htm#SQLRF00609
AVG([ DISTINCT | ALL ] expr)
[ OVER(analytic_clause) ]
- 具体问题具体分析,在统计分析报表系统中AVG分析函数用处颇大。
- 有关分析函数的扩展可以参考Oracle的官方文档中的“Analytic Functions”描述:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions001.htm#SQLRF06174
- 通过实验看一下两种AVG函数的用法和区别
-- 创建测试表T,并初始化几条数据
create table t (group_id number(10), name varchar2(10), salary int);
insert into t values (1,'Tom',1200);
insert into t values (2,'Kary',2400);
insert into t values (2,'Joe',800);
insert into t values (3,'Erick',3600);
insert into t values (3,'Andy',600);
insert into t values (3,'Mary',300);
commit;
-- T表全貌
-- 共三组数据,group_id分别是1、2和3。第1组有一个人,第2组有两个人,第3组有三个人。最后一列是每个人的薪水值
select * from t;
GROUP_ID NAME SALARY
---------- ------------------------------ ----------
1 Tom 1200
2 Kary 2400
2 Joe 800
3 Erick 3600
3 Andy 600
3 Mary 300
6 rows selected.
-- 普通AVG函数的用法
-- 得到的平均值是按照“group_id, name, salary”三列进行分组后的每组平均值
select group_id, name, salary, avg(salary) from t group by group_id, name, salary order by group_id;
GROUP_ID NAME SALARY AVG(SALARY)
---------- ------------------------------ ---------- -----------
1 Tom 1200 1200
2 Joe 800 800
2 Kary 2400 2400
3 Andy 600 600
3 Erick 3600 3600
3 Mary 300 300
6 rows selected.
-- 再看一下分析函数AVG得到的平均值
-- 注意这里得到的平均值与基本AVG函数得到的平均值区别,这里的平均值是每行记录所对应组内的平均薪酬值
select group_id, name, salary, avg(salary) over (partition by group_id) analytic_avg from t order by group_id;
GROUP_ID NAME SALARY ANALYTIC_AVG
---------- ------------------------------ ---------- ------------
1 Tom 1200 1200
2 Kary 2400 1600
2 Joe 800 1600
3 Erick 3600 1500
3 Andy 600 1500
3 Mary 300 1500
6 rows selected.
-- 进一步限定一下计算的范围
-- 此时得到的薪酬值是每行记录与其之前的记录和其之后的记录三者的平均值
-- 注意头和尾的平均值计算方法
-- 头:组内第一条记录与第二条记录的和除以二得到第一条记录的平均值
-- 尾:组内最后一条记录与倒数第二条记录的和除以二得到最后一条记录的平均值
select group_id, name, salary, avg(salary) over (partition by group_id order by name rows between 1 preceding and 1 following) analytic_avg from t order by group_id;
GROUP_ID NAME SALARY ANALYTIC_AVG
---------- ------------------------------ ---------- ------------
1 Tom 1200 1200
2 Joe 800 1600
2 Kary 2400 1600
3 Andy 600 2100
3 Erick 3600 1500
3 Mary 300 1950
6 rows selected.
0 件のコメント:
コメントを投稿