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...