oracle 求每組的最小值的人員資訊

2021-08-20 19:18:27 字數 1327 閱讀 3667

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

分組求最大最小值

按某一欄位分組取最大 小 值所在行的資料 資料如下 name val memo a 2 a2 a的第二個值 a 1 a1 a的第乙個值 a 3 a3 a的第三個值 b 1 b1 b的第乙個值 b 3 b3 b的第三個值 b 2 b2b2b2b2 b 4 b4b4 b 5 b5b5b5b5b5 建立表...

求區域性最小值問題

我們可以採用二分法,先判斷最後乙個元素和第乙個元素是否是區域性最小值,如果是否的話,那在陣列中肯定存在乙個區域性最小值的元素,繼續遍歷即可 public static int getlessindex int arr if arr.length 1 arr 0 arr 1 if arr arr.le...

求m區間的最小值

乙個含有n項的數列 n 2000000 求出每一項前的m個數到它這個區間內的最小值。若前面的數不足m項則從第1個數開始,若前面沒有數則輸出0。第一行兩個數n,m。第二行,n個正整數,為所給定的數列。n行,第i行的乙個數ai,為所求序列中第i個數前m個數的最小值。6 27 8 1 4 3 207 71...