Oracle over函數(shù)

SQL code:

sql over的作用及用法
RANK ( ) OVER ( [query_partition_clause] order_by_clause )
DENSE_RANK ( ) OVER ( [query_partition_clause] order_by_clause )
可實(shí)現(xiàn)按指定的字段分組排序,對(duì)于相同分組字段的結(jié)果集進(jìn)行排序,
其中PARTITION BY 為分組字段,ORDER BY 指定排序字段


over不能單獨(dú)使用,要和分析函數(shù):rank(),dense_rank(),row_number()等一起使用。
其參數(shù):over(partition by columnname1 order by columnname2)
含義:按columname1指定的字段進(jìn)行分組排序,或者說(shuō)按字段columnname1的值進(jìn)行分組排序。
例如:employees表中,有兩個(gè)部門(mén)的記錄:department_id =10和20
select department_id,rank() over(partition by department_id order by salary) from employees就是指在部門(mén)10中進(jìn)行薪水的排名,在部門(mén)20中進(jìn)行薪水排名。如果是partition by org_id,則是在整個(gè)公司內(nèi)進(jìn)行排名。


SQL code:
WITH
OBJ AS(
SELECT
name, type

 

目的:以oracle自帶的scott模式為測(cè)試環(huán)境,主要通過(guò)試驗(yàn)體會(huì)分析函數(shù)的用法。

類(lèi)似 sum(...) over ... 的使用


1.原表信息:

SQL> break on deptno skip 1 -- 為效果更明顯,把不同部門(mén)的數(shù)據(jù)隔段顯示。
SQL> select deptno,ename,sal
2 from emp
3 order by deptno;

    DEPTNO ENAME             SAL
---------- ---------- ----------
        10 CLARK            2450
           KING             5000
           MILLER           1300

        20 SMITH             800
           ADAMS            1100
           FORD             3000
           SCOTT            3000
           JONES            2975

        30 ALLEN            1600
           BLAKE            2850
           MARTIN           1250
           JAMES             950
           TURNER           1500
           WARD             1250


已選擇14行。



2.先來(lái)一個(gè)簡(jiǎn)單的,注意over(...)條件的不同,
使用 sum(sal) over (order by ename)... 查詢(xún)員工的薪水“連續(xù)”求和,
注意over (order by ename)如果沒(méi)有order by 子句,求和就不是“連續(xù)”的,
放在一起,體會(huì)一下不同之處:

SQL> break on '' -- 取消數(shù)據(jù)分段顯示
SQL> select deptno,ename,sal,
2 sum(sal) over (order by ename) 連續(xù)求和,
3 sum(sal) over () 總和,                  -- 此處sum(sal) over () 等同于sum(sal)
4 100*round(sal/sum(sal) over (),4) "份額(%)"
5 from emp
6 /

    DEPTNO ENAME             SAL   連續(xù)求和       總和    份額(%)
---------- ---------- ---------- ---------- ---------- ----------
        20 ADAMS            1100       1100      29025       3.79
        30 ALLEN            1600       2700      29025       5.51
        30 BLAKE            2850       5550      29025       9.82
        10 CLARK            2450       8000      29025       8.44
        20 FORD             3000      11000      29025      10.34
        30 JAMES             950      11950      29025       3.27
        20 JONES            2975      14925      29025      10.25
        10 KING             5000      19925      29025      17.23
        30 MARTIN           1250      21175      29025       4.31
        10 MILLER           1300      22475      29025       4.48
        20 SCOTT            3000      25475      29025      10.34
        20 SMITH             800      26275      29025       2.76
        30 TURNER           1500      27775      29025       5.17
        30 WARD             1250      29025      29025       4.31

已選擇14行。


3.使用子分區(qū)查出各部門(mén)薪水連續(xù)的總和。注意按部門(mén)分區(qū)。注意over(...)條件的不同,
sum(sal) over (partition by deptno order by ename) 按部門(mén)“連續(xù)”求總和
sum(sal) over (partition by deptno) 按部門(mén)求總和
sum(sal) over (order by deptno,ename) 不按部門(mén)“連續(xù)”求總和
sum(sal) over () 不按部門(mén),求所有員工總和,效果等同于sum(sal)。

SQL> break on deptno skip 1 -- 為效果更明顯,把不同部門(mén)的數(shù)據(jù)隔段顯示。
SQL> select deptno,ename,sal,
2 sum(sal) over (partition by deptno order by ename) 部門(mén)連續(xù)求和,--各部門(mén)的薪水"連續(xù)"求和
3 sum(sal) over (partition by deptno) 部門(mén)總和, -- 部門(mén)統(tǒng)計(jì)的總和,同一部門(mén)總和不變
4 100*round(sal/sum(sal) over (partition by deptno),4) "部門(mén)份額(%)",
5 sum(sal) over (order by deptno,ename) 連續(xù)求和, --所有部門(mén)的薪水"連續(xù)"求和
6 sum(sal) over () 總和, -- 此處sum(sal) over () 等同于sum(sal),所有員工的薪水總和
7 100*round(sal/sum(sal) over (),4) "總份額(%)"
8 from emp
9 /

DEPTNO ENAME    SAL 部門(mén)連續(xù)求和   部門(mén)總和 部門(mén)份額(%)   連續(xù)求和   總和 總份額(%)
------ ------ ----- ------------ ---------- ----------- ---------- ------ ----------
    10 CLARK   2450         2450       8750          28       2450 29025       8.44
       KING    5000         7450       8750       57.14       7450 29025      17.23
       MILLER 1300         8750       8750       14.86       8750 29025       4.48

    20 ADAMS   1100         1100     10875       10.11       9850 29025       3.79
       FORD    3000         4100      10875       27.59      12850 29025      10.34
       JONES   2975         7075      10875       27.36      15825 29025      10.25
       SCOTT   3000        10075      10875       27.59      18825 29025      10.34
       SMITH    800        10875      10875        7.36      19625 29025       2.76

    30 ALLEN   1600         1600       9400       17.02      21225 29025       5.51
       BLAKE   2850         4450       9400       30.32      24075 29025       9.82
       JAMES    950         5400       9400       10.11      25025 29025       3.27
       MARTIN 1250         6650       9400        13.3      26275 29025       4.31
       TURNER 1500         8150       9400       15.96      27775 29025       5.17
       WARD    1250         9400       9400        13.3      29025 29025       4.31


已選擇14行。



4.來(lái)一個(gè)綜合的例子,求和規(guī)則有按部門(mén)分區(qū)的,有不分區(qū)的例子
SQL> select deptno,ename,sal,sum(sal) over (partition by deptno order by sal) dept_sum,
2 sum(sal) over (order by deptno,sal) sum
3 from emp;

    DEPTNO ENAME             SAL   DEPT_SUM        SUM
---------- ---------- ---------- ---------- ----------
        10 MILLER           1300       1300       1300
           CLARK            2450       3750       3750
           KING             5000       8750       8750

        20 SMITH             800        800       9550
           ADAMS            1100       1900      10650
           JONES            2975       4875      13625
           SCOTT            3000      10875      19625
           FORD             3000      10875      19625

        30 JAMES             950        950      20575
           WARD             1250       3450      23075
           MARTIN           1250       3450      23075
           TURNER           1500       4950      24575
           ALLEN            1600       6550      26175
           BLAKE            2850       9400      29025


已選擇14行。



5.來(lái)一個(gè)逆序的,即部門(mén)從大到小排列,部門(mén)里各員工的薪水從高到低排列,累計(jì)和的規(guī)則不變。

SQL> select deptno,ename,sal,
2 sum(sal) over (partition by deptno order by deptno desc,sal desc) dept_sum,
3 sum(sal) over (order by deptno desc,sal desc) sum
4 from emp;

    DEPTNO ENAME             SAL   DEPT_SUM        SUM
---------- ---------- ---------- ---------- ----------
        30 BLAKE            2850       2850       2850
           ALLEN            1600       4450       4450
           TURNER           1500       5950       5950
           WARD             1250       8450       8450
           MARTIN           1250       8450       8450
           JAMES             950       9400       9400

        20 SCOTT            3000       6000      15400
           FORD             3000       6000      15400
           JONES            2975       8975      18375
           ADAMS            1100      10075      19475
       MITH             800      10875      20275

        10 KING             5000       5000      25275
           CLARK            2450       7450      27725
           MILLER           1300       8750      29025


已選擇14行。



6.體會(huì):在"... from emp;"后面不要加order by 子句,使用的分析函數(shù)的(partition by deptno order by sal)
里已經(jīng)有排序的語(yǔ)句了,如果再在句尾添加排序子句,一致倒罷了,不一致,結(jié)果就令人費(fèi)勁了。如:

SQL> select deptno,ename,sal,sum(sal) over (partition by deptno order by sal) dept_sum,
2 sum(sal) over (order by deptno,sal) sum
3 from emp
4 order by deptno desc;

    DEPTNO ENAME             SAL   DEPT_SUM        SUM
---------- ---------- ---------- ---------- ----------
        30 JAMES             950        950      20575
           WARD             1250       3450      23075
           MARTIN           1250       3450      23075
           TURNER           1500       4950      24575
           ALLEN            1600       6550      26175
           BLAKE            2850       9400      29025

        20 SMITH             800        800       9550
           ADAMS            1100       1900      10650
           JONES            2975       4875      13625
           SCOTT            3000      10875      19625
           FORD             3000      10875      19625

        10 MILLER           1300       1300       1300
           CLARK            2450       3750       3750
           KING             5000       8750       8750


已選擇14行


==================================================================
利用over實(shí)現(xiàn)的分頁(yè)功能:
--假設(shè)code1,code2為用來(lái)分頁(yè)的KEY,每頁(yè)顯示5第數(shù)據(jù)
select code1,code2,code3,
ceil(count(*) over(partition by code1,code2 order by rownum)/5),
count(*) over(partition by code1,code2)
from ma_kbn order by code1,code2

==================================================================