问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

oracle中的over函数怎么用的,什么意思

发布网友 发布时间:2022-04-28 15:38

我来回答

3个回答

懂视网 时间:2022-04-08 01:26

--显示各部门员工的工资,并附带显示该部分的最高工资。
SELECT E.DEPTNO,
E.EMPNO,
E.ENAME,
E.SAL,
LAST_VALUE(E.SAL)
OVER(PARTITION BY E.DEPTNO
ORDER BY E.SAL ROWS
--unbounded preceding and unbouned following针对当前所有记录的前一条、后一条记录,也就是表中的所有记录
--unbounded:不受控制的,无限的
--preceding:在...之前
--following:在...之后
BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_SAL
FROM EMP E;
技术分享

运行结果:

技术分享

               

示例目的:按照deptno分组,然后计算每组值的总和

SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY ENAME) max_sal
FROM SCOTT.EMP;

运行结果:

技术分享

     

示例目的:对各部门进行分组,并附带显示第一行至当前行的汇总

技术分享
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
--注意ROWS BETWEEN unbounded preceding AND current row 是指第一行至当前行的汇总
SUM(SAL) OVER(PARTITION BY DEPTNO
ORDER BY ENAME
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) max_sal
FROM SCOTT.EMP;
技术分享

运行结果:

技术分享

   

示例目标:当前行至最后一行的汇总

技术分享
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
--注意ROWS BETWEEN current row AND unbounded following 指当前行到最后一行的汇总
SUM(SAL) OVER(PARTITION BY DEPTNO
ORDER BY ENAME
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) max_sal
FROM SCOTT.EMP;
技术分享

运行结果:

技术分享

   

 示例目标:当前行的上一行(rownum-1)到当前行的汇总

技术分享
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
--注意ROWS BETWEEN 1 preceding AND current row 是指当前行的上一行(rownum-1)到当前行的汇总
SUM(SAL) OVER(PARTITION BY DEPTNO
ORDER BY ENAME ROWS
BETWEEN 1 PRECEDING AND CURRENT ROW) max_sal
FROM SCOTT.EMP;
技术分享

运行结果:

技术分享

    

示例目标:   当前行的上一行(rownum-1)到当前行的下辆行(rownum+2)的汇总     

技术分享
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
--注意ROWS BETWEEN 1 preceding AND 1 following 是指当前行的上一行(rownum-1)到当前行的下辆行(rownum+2)的汇总
SUM(SAL) OVER(PARTITION BY DEPTNO
ORDER BY ENAME
ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING) max_sal
FROM SCOTT.EMP;
技术分享

运行结果:

技术分享

Oracle分析函数入门

标签:

热心网友 时间:2022-04-07 22:34

over函数是oracle中的分析函数,分析函数是对行集组进行聚合计算,但是不像普通聚合仗函数那样每组只返回一个值,分析函数可以为每组返回多个值。

使用方法为:over(partition by排 列名1 order by 列名2 ),括号中的两个关键词partition by 和order by 可以只出现一个。over() 前面是一个函数,如果是聚合函数,那么order by 不能一起使用。


扩展资料

在SQL语句中,很多查询语句需要进行GROUP BY分组汇总,但是一旦经过分组,SELECT返回的记录孢数就会减少。为了保留所有原始行记录,并且仍可以进行分组数据分析,分析函数应运而生。

oracle数据库函数,分析函数用于为行定义一个窗口,对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。

RANK()也为每一组的行生成一个序号,与ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如两个相同的行生成序号3,那么接下来会生成序号。

DENSE_RANK()和RANK()类似,不同的是如果有相同的序号,那么接下来的序号不会间断。也就是说如果两个相同的行生成序号,那么接下来生成的序号还是。

参考资料来源:百度百科-分析函数

热心网友 时间:2022-04-07 23:52

Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。
一、 over函数
over函数指定了分析函数工作的数据窗口的大小,这个数据窗口大小可能会随着行的变化而变化,例如:
over(order by salary)按照salary排序进行累计,order by是个默认的开窗函数
over(partition by deptno) 按照部门分区
over(order by salary range between 50 preceding and 150 following)每行对应的数据窗口是之前行幅度值不超过50,之后行幅度值不超过150的数据记录
over(order by salary rows between 50 perceding and 150 following)前50行,后150行
over(order by salary rows between unbounded preceding and unbounded following)所有行
over(order by salary range between unbounded preceding and unbounded following)所有行
二、 sum函数
功能描述:该函数计算组中表达式的累积和。
SAMPLE:下例计算同一经理下员工的薪水累积值
SELECT manager_id, last_name, salary,
SUM (salary) OVER (PARTITION BY manager_id ORDER BY salary
RANGE UNBOUNDED PRECEDING) l_csum
FROM employees
WHERE manager_id in (101,103,108);
三、 应用实例
1, 测试环境设置
设有销售表t_sales (subcompany,branch,region,customer,sale_qty); 存储客户的销售明细,记录如下所示。
Subcompany Branch Region Customer Sale_qty
北京分公司 北京经营部 片区1 客户1 1
北京分公司 北京经营部 片区1 客户1 1
北京分公司 北京经营部 片区1 客户2 1
北京分公司 北京经营部 片区1 客户2 1
北京分公司 北京经营部 片区2 客户1 1
北京分公司 北京经营部 片区2 客户1 1
北京分公司 北京经营部 片区2 客户2 1
北京分公司 北京经营部 片区2 客户2 1
北京分公司 其他经营部 片区1 客户1 1
北京分公司 其他经营部 片区1 客户1 1
北京分公司 其他经营部 片区1 客户2 1
北京分公司 其他经营部 片区1 客户2 1
北京分公司 其他经营部 片区2 客户1 1
北京分公司 其他经营部 片区2 客户1 1
北京分公司 其他经营部 片区2 客户2 1
北京分公司 其他经营部 片区2 客户2 1
create table t_sales(
subcompany varchar2(40),
branch varchar2(40),
region varchar2(40),
customer varchar2(40),
sale_qty numeric(18,4)
);

comment on table t_sales is '销售表,分析函数测试';
comment on column t_sales.subcompany is '分公司';
comment on column t_sales.branch is '经营部';
comment on column t_sales.region is '片区';
comment on column t_sales.customer is '客户';
comment on column t_sales.sale_qty is '销售数量';

2,问题提出
现在要求给出销售汇总报表,报表中需要提供的数据包括客户汇总,和客户在其上级机构中的销售比例。
Subcompany Branch Region Customer Sale_qty Rate
北京分公司 北京经营部 片区1 客户1 2 50%
北京分公司 北京经营部 片区1 客户2 2 50%
北京分公司 北京经营部 片区1 小计 4 50%
北京分公司 北京经营部 片区2 客户1 2 50%
北京分公司 北京经营部 片区2 客户2 2 50%
北京分公司 北京经营部 片区2 小计 4 50%
北京分公司 北京经营部 小计 小计 8 50%
北京分公司 北京经营部 片区1 客户1 2 50%
北京分公司 北京经营部 片区1 客户2 2 50%
北京分公司 北京经营部 片区1 小计 4 50%
北京分公司 北京经营部 片区2 客户1 2 50%
北京分公司 北京经营部 片区2 客户2 2 50%
北京分公司 北京经营部 片区2 小计 4 50%
北京分公司 北京经营部 小计 小计 8 50%
北京分公司 小计 小计 小计 16 100%
3,解决方案(方案1)
首先我们可以使用oracle对group by 的扩展功能rollup得到如下的聚合汇总结果。
select
subcompany,
branch,
region,
customer,
sum(sale_qty) sale_qty
from t_sales
group by rollup(subcompany,branch,region,customer);
Subcompany Branch Region Customer Sale_qty
北京分公司 北京经营部 片区1 客户1 2
北京分公司 北京经营部 片区1 客户2 2
北京分公司 北京经营部 片区1 4
北京分公司 北京经营部 片区2 客户1 2
北京分公司 北京经营部 片区2 客户2 2
北京分公司 北京经营部 片区2 4
北京分公司 北京经营部 8
北京分公司 其他经营部 片区1 客户1 2
北京分公司 其他经营部 片区1 客户2 2
北京分公司 其他经营部 片区1 4
北京分公司 其他经营部 片区2 客户1 2
北京分公司 其他经营部 片区2 客户2 2
北京分公司 其他经营部 片区2 4
北京分公司 其他经营部 8
北京分公司 16
16
分析上面的临时结果,我们看到:
明细到客户的汇总信息,其除数为当前的sum(sale_qty),被除数应该是到片区的小计信息。
明细到片区的汇总信息,其除数为片区的sum(sale_qty),被除数为聚合到经营部的汇总数据。
。。。
考虑到上述因素,我们可以使用oracle的开窗函数over,将数据定位到我们需要定位的记录。如下代码中,我们利用开窗函数over直接将数据定位到其上次的小计位置。
over(partition by decode(f_branch, 1, null, subcompany), decode(f_branch, 1, null, decode(f_region, 1, null, branch)), decode(f_branch, 1, null, decode(f_region, 1, null, decode(f_customer, 1, null, region))), null)
经整理后的查询语句如下。
select subcompany,
decode(f_branch, 1,subcompany||'(С¼Æ)', branch),
decode(f_region,1,branch||'(С¼Æ)',region),
decode(f_customer,1,region||'(С¼Æ)', customer),
sale_qty,
trim(to_char(round(sale_qty/
sum(sale_qty) over(partition by decode(f_branch, 1, null, subcompany), decode(f_branch, 1, null, decode(f_region, 1, null, branch)), decode(f_branch, 1, null, decode(f_region, 1, null, decode(f_customer, 1, null, region))), null),2) *100,99990.99))
from (select grouping(branch) f_branch,
grouping(region) f_region,
grouping(customer) f_customer,
subcompany,
branch,
region,
customer,
sum(sale_qty) sale_qty
from t_sales
group by subcompany, rollup(branch, region, customer))
Subcompany Branch Region Customer Sale_qty Rate
北京分公司 北京经营部 片区1 客户1 2 50.00
北京分公司 北京经营部 片区1 客户2 2 50.00
北京分公司 北京经营部 片区2 客户1 2 50.00
北京分公司 北京经营部 片区2 客户2 2 50.00
北京分公司 北京经营部 片区1 片区1(小计) 4 50.00
北京分公司 北京经营部 片区2 片区2(小计) 4 50.00
北京分公司 其他经营部 片区1 客户1 2 50.00
北京分公司 其他经营部 片区1 客户2 2 50.00
北京分公司 其他经营部 片区2 客户1 2 50.00
北京分公司 其他经营部 片区2 客户2 2 50.00
北京分公司 其他经营部 片区1 片区1(小计) 4 50.00
北京分公司 其他经营部 片区2 片区2(小计) 4 50.00
北京分公司 北京经营部 北京经营部(小计) (小计) 8 50.00
北京分公司 其他经营部 其他经营部(小计) (小计) 8 50.00
北京分公司 北京分公司(小计) (小计) (小计) 16 100.00
北京分公司 北京经营部 片区1 客户1 2 50.00
4,可能的另外一种解决方式(方案2)
select subcompany,
decode(f_branch, 1,subcompany||'(С¼Æ)', branch),
decode(f_region,1,branch||'(С¼Æ)',region),
decode(f_customer,1,region||'(С¼Æ)', customer),
sale_qty,
/* trim(to_char(round(sale_qty/*/
decode(f_branch+f_region+f_customer,
0,
(sum(sale_qty) over(partition by subcompany,branch,region))/2,
1,
(sum(sale_qty) over(partition by subcompany,branch))/3,
2,
(sum(sale_qty) over(partition by subcompany))/4 ,
sum(sale_qty) over()/4
)/*
,2) *100,99990.99))*/
from (select grouping(branch) f_branch,
grouping(region) f_region,
grouping(customer) f_customer,
subcompany,
branch,
region,
customer,
sum(sale_qty) sale_qty
from t_sales
group by subcompany, rollup(branch, region, customer))
在上面的解决方式中,最大的问题在于开窗函数过大。导致每次计算涉及到的行数过多,影响到执行的速度和效率。并且需要额外的计算处理清除多余叠加进去的数值 。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 笔记本电脑屏幕开机锁忘记密码 怎么办?急死了 华硕笔记本电脑开机密码忘记了怎样找回?系统是Windows 7旗舰版... Oracle row_number() over()解析函数高效实现分页 oracle 分析函数rank()over()使用,与group by的区别 SQL lag() over()函数用法什么用? ORACLE的CASE函数和RANK函数套用,这是查询代码中的一部分,代码没问题... oracle7中如何分组排序(就像使用rank函数的功能一样的结果) 梦到家中被水淹了,啥意思 昨晚梦到我家了,我回家前面别人家的房子还好好的,可走到我家那路口,发现没路走了,就我一家被水淹了! 梦到去上学别人家房子被水淹没 梦见别的地方房子被洪水冲塌,但是家里有一个生病的老人,这代表什么意 ... 为什么香蕉放冰箱里会变黑? 如何防止香蕉变黑 香蕉的芯变黑还能吃吗? 香蕉里面有点黑了还能吃吗? 教师资格证认定时是不是要求普通话证书在两年的有效期内? 教师考试普通话等级证书有效期是多久? 为了对称,汉字排版竖排顺序可以从左向右吗 东吴大学的校训 闻香识女人电影 三个人戏弄校长那一段话 要英文的 校训在古代叫什么?古代的书院有没有像现在这样的校训? 校长办公室富有个性的名言 如何使用连接表替代oracle 的lag() 函数 oracle 多字段查询数据排重,除了row_number()over(partition by )还能... Oracle数据库下 distinct 与row_number() over的用法 oracle里面更新操作能带有四则运算吗 这句select row_number() over (order by ProductID asc) as RowIndex... Oracle中使用to_number()函数,里面有文字怎么解决 (高分求助)两个比较难的SQL2000的SQL语句查询问题,非专家莫入! 我要用oracle根据我截取到的年龄分组,查询显示其它字段,但是不用max... 使用oracle求出制定日期(timestamp或date类型)的后三天日期,请问用哪 ... 股票里多出标准券是什么意思 股票里的标准券怎么取出 有没有关于excel最基础使用(如使用函数、填充柄、换行时自动编号等)的word版本,最好有截图的 装修必须知道的软装搭配知识都有什么? 美式软装搭配要注意什么?搭配技巧有哪些? 黄色的墙面,软装该如何搭配? 现代简约风格软装如何搭配 软装的色彩如何搭配比较好呢? 红木装修软装怎么搭配? 标准券买了要几天能卖 精装修房如何搭配软装