首 页 行业热点 新车 试驾评测 养车用车 车型库

oracle分析函数问题

发布网友 发布时间:2022-04-22 04:44

我来回答

3个回答

热心网友 时间:2022-04-08 20:40

sum(sal) over (partition by deptno order by deptno desc,sal desc)意思是按照deptno分区对sal“对应deptno和sal连续”求和,而over函数中的order by是指在在同一deptno分区内进行排序 “连续求和”,同一分区内的deptno肯定相同,所以没有意义,而同一分区内的sal倒序“连续求和”,意味着本条记录的求和结果等于上条记录的求和结果+本条记录员工的sal,同一deptno中员工的sal是倒序的,而不是整个结果按照sal倒序,也不是对求和后的sal倒序排列。
** 注意连续求和的结果。
sum(sal) over (order by deptno desc,sal desc) 不按deptno分区,不按部门“连续”求总和追问感谢你的回答让我一下子明白了,可惜百度只让采纳一个。

热心网友 时间:2022-04-08 21:58

你的写法1 每个分区内的sal是倒序排列的

不过写法1中 order by deptno desc其实没有起到作用,因为有partition  by deptno子句,如果想要结果按deptno倒序排列,请把order by deptno desc移到最外层:

select ename, sal, deptno, 

       sum(sal) over(partition by deptno order by sal desc) 
  from emp order by  deptno desc;

写法2中,你去掉了partition子句,以整个表为分区,这时候计算需要按照 deptno & sal的指定排序进行,进而每一行顺序和写法1不同。

 

简单说,你想要最后结果按特定排序,请在外层使用order by子句

over后面的order by开窗子句影响计算顺序,并不决定最后结果的顺序。

追问我那样写deptno没有倒序我能理解,但是我写的是over(partition by.....order by deptno desc sal desc)
你看我贴出来的第一张图,sal也不是倒序的啊?
我就弄不明白这个,难道说前面有了deptno desc 之后,那个sal desc就不执行了么?

追答你的写法1里面,sal是按照每个分区倒序排序的

前面说过了 over后面的order by开窗子句影响计算顺序,并不决定最后结果的顺序
想要最后结果按特定排序,请在外层使用order by子句

热心网友 时间:2022-04-08 23:33

select ename,sal,deptno,
sum(sal) over (partition by deptno order by deptno desc,sal desc)
from emp
order by order by deptno desc,sal desc;追问这个是正解。
但是我想知道为什么不加最后的order by语句,前面括号里的order by后面加desc就毫无作用。
如果去掉最外层的order by 语句,结果既不会按照deptno倒序排列,也不会按sal倒序排列。
这个是不是说明只要over括号内有按照partition by 分区,over括号内后面的order by就不会执行倒序排列?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com