oracle 求每组的最小值的人员信息

1.求每组的最小值的人员信息
–普通写法 这种要访问2次emp
with tt as (
select e.deptno,min(e.sal) min_sal from emp e group by e.deptno
)
select e.deptno,e.ename,e.sal from emp e,tt
where e.deptno=tt.deptno
and e.sal=tt.min_sal ;

–分析函数 ,这种只需要访问一次emp(推荐,效率更高)
–方式1
select * from (
select e.empno,e.deptno,e.sal,
dense_rank() over(partition by e.deptno order by sal) rn
from emp e) where rn=1 ;–and tt.deptno is not null;

方式2:感觉做个执行计划稍微好点
select * from (
select e.ename,e.sal,e.deptno,max(sal) over(partition by e.deptno) maxsal from emp e) tt
where tt.maxsal=tt.sal;

–方式3 keep
select * from (
select e.deptno,
e.sal,
e.ename,
max(e.sal) keep(dense_rank first order by null) over(partition by e.deptno) maxsal
from emp e)tt
where tt.sal=tt.maxsal ;

2.去重deptno
delete from emp e1
where rowid <(
select max(rowid) from emp e2 where e1.deptno= e2.deptno
);
这种访问3次emp

–分析函数 关键是筛选rowid
delete from emp e1 where e1.rowid not in(
select rowid rod from (
select rowid,
row_number() over(partition by e2.deptno order by null) rn
from emp e2 ) where rn=1
) ;
这种访问2次emp

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值