永发信息网

oracle中去除最大最小值后求方差用什么函数

答案:2  悬赏:30  手机版
解决时间 2021-02-12 14:12
oracle中去除最大最小值后求方差用什么函数
最佳答案
(1)oracle使用keep分析函数取最值记录
  -- 取工资sal最大的雇员姓名及其工资,以及工资sal最少的雇员姓名及其工资select
  deptno,
  empno,
  ename,
  sal,
  max(ename) keep(dense_rank FIRST order by sal) over (partition by deptno) as min_sal_man,max(sal) keep(dense_rank FIRST order by sal) over (partition by deptno) as min_sal,max(ename) keep(dense_rank LAST order by sal) over (partition by deptno) as max_sal_man,max(sal) keep(dense_rank LAST order by sal) over (partition by deptno) as max_salfrom emp
  where deptno=10
  结果如下:
  技术分享
  从语句中可以看到,ename和sal都是用的max(),这样做的目的是为了去除由于keep()函数得到的有重复值的数据结果集。这样用有一个弊端,加入部门20有两个相同的最大SAL的人,部门30有两个相同的最小SAL的人,如果按照这种方法取出来的数据,就不一定准确了,重复的人会被去除掉。
  我们用下面的语句来修改一下:
  select
  deptno,
  empno,
  ename,
  sal,
  max(ename) keep(dense_rank FIRST order by sal) over (partition by deptno) as min_sal_man,max(sal) keep(dense_rank FIRST order by sal) over (partition by deptno) as min_sal,max(ename) keep(dense_rank LAST order by sal) over (partition by deptno) as max_sal_man,max(sal) keep(dense_rank LAST order by sal) over (partition by deptno) as max_sal,wmsys.wm_concat(ename) keep(dense_rank LAST order by sal) over (partition by deptno) as 工资最高的人,wmsys.wm_concat(ename) keep(dense_rank FIRST order by sal) over (partition by deptno) as 工资最低的人from emp
  where deptno=20
  order by 1, 2 ;
  我们新增了两个列:工资最高的人,工资最低的人。执行看一下结果:
  技术分享
  可以看到,deptno=20时,SCOTT和FORD两个人的工资SAL都是3000,如果用MAX()就只能取出其中一个人的姓名,显然是不对的。
  然后,我们再来看一下deptno=30时的情况:
  select
  deptno,
  empno,
  ename,
  sal,
  max(ename) keep(dense_rank FIRST order by sal) over (partition by deptno) as min_sal_man,max(sal) keep(dense_rank FIRST order by sal) over (partition by deptno) as min_sal,max(ename) keep(dense_rank LAST order by sal) over (partition by deptno) as max_sal_man,max(sal) keep(dense_rank LAST order by sal) over (partition by deptno) as max_sal,wmsys.wm_concat(ename) keep(dense_rank LAST order by sal) over (partition by deptno) as 工资最高的人,wmsys.wm_concat(ename) keep(dense_rank FIRST order by sal) over (partition by deptno) as 工资最低的人from emp
  where deptno=30
  order by 1, 2 ;
  deptno=30时的结果如下:
  技术分享
  可以看到,deptno=30时,WARD和MARTIN两人的工资最小且均为1250,如果用MAX()的方式,就只能取出其中一个人的名称。
  这就是因为keep()取出来的数据集是包含多个数据结果的,所以,在语句中使用了wmsys.wm_concat()函数,该函数的作用是以逗号分隔连接列的值。
  注:wm_concat()的功能有点儿类似分析函数listagg() within group() 。
  (2)使用SQL子查询和聚合函数,查询出最大值和最小值-- 使用子查询查询出最大值和最小值
  select * from
  (
  select
  deptno,
  listagg(ename,‘,‘) within group (order by deptno) as dept_max_ename,max(sal) as dept_max_sal
  from emp
  where (deptno,sal) in (select deptno, max(sal) as max_sal from emp group by deptno)group by deptno
  ) A
  inner join
  (
  select
  deptno,
  listagg(ename,‘,‘) within group (order by deptno) as dept_min_ename,min(sal) as dept_min_sal
  from emp
  where (deptno,sal) in (select deptno, min(sal) as min_sal from emp group by deptno)group by deptno
  ) B
  on A.deptno = B.deptno
  结果如下:
  技术分享
  在这个方案里面,还使用了listagg()分析函数将最值有重复姓名的人合并在一起,用wm_concat()函数替代listagg()也可以wm_concat(ename) as dept_max_ename,
  wm_concat(ename) as dept_min_ename,
全部回答
我。。知。。道 加。。我。。私。。聊
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
有一个女孩上课总是看我,每次我一看她她就不
永盛水暖建材我想知道这个在什么地方
我想报考飞行员 平时如何注意饮食?好心人帮
近30天品质退款率
什么地方有训狗狗的我家泰迪咬人
有没有浴室防潮技巧
准格尔旗薛家湾第八小学地址在什么地方,想过
世纪皇廷酒店地址在哪,我要去那里办事
现有酒精、白醋、食盐水各一瓶,怎样区别他们?
有一个qq游戏,图案是变形金刚,是角色扮演
找一篇小说,女主很会弹古筝,好像女主家里有
隐形眼镜洗的时候盒子里有黑丝
雄大昌隆地址在什么地方,我要处理点事
中考英语作文分几段写,每段该怎么写?谢谢
跃峰制冷设备这个地址在什么地方,我要处理点
推荐资讯
东方旅社在什么地方啊,我要过去处理事情
陈记正宗贞丰特色地摊砂锅火锅在什么地方啊,
离发工资的时间都过了快一个星期了,怎么还没
下列各项属于发展能力分析的主要指标的是()。
卵黄囊1.1x0.6是怀孕多少周了
在一定温度下,反应A2(气)+B2(气)?2AB(
上次禁毒大队查房,验了尿,还用手机拍身份证
优盘中毒怎么恢复
换地方了QQ登陆异常怎么办
商业地产首付多少
【惯用语有哪些】惯用语跟俗语的区别请举例说
拉天娜品牌内衣美甲怎么去啊,我要去那办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?