--将部门里的人员转化为一列
select deptno,ltrim(max(sys_connect_by_path(ename,',')),',') ename
from
(
select deptno,ename,min(ename) over(partition by deptno) d_min,
(row_number() over(order by deptno)+(dense_rank() over (order by deptno))) numid
from emp order by deptno,ename
)
start with ename=d_min connect by numid-1=prior numid
group by deptno;
-- 求每个部门的平均工资以及每个人与所在部门的工资差额
这些都是分析函数,好像是8.0以后才有的 row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序) rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内) dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 lag(arg1,arg2,arg3): arg1是从其他行返回的表达式 arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。 arg3是在arg2表示的数目超出了分组的范围时返回的值。
select deptno,ename,sal ,
round(avg(sal) over(partition by deptno)) as dept_avg_sal,
round(sal-avg(sal) over(partition by deptno)) as dept_sal_diff
from emp;