zoukankan      html  css  js  c++  java
  • Oracle中常用的计算、统计类函数

    Oracle中常用的计算、统计类函数


    group by

    scott@DBHAWK>select deptno,sum(sal) from emp group by deptno;
    
        DEPTNO   SUM(SAL)
    ---------- ----------
        30       9400
        20       10875
        10       8750

    rank ( ) over (partition by … order by … )

    scott@DBHAWK>select t.*,rank() over(partition by deptno order by sal desc) RANK from emp t;
    
         EMPNO ENAME      JOB          MGR HIREDATE     SAL           COMM     DEPTNO       RANK
    ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ----------
          7839 KING       PRESIDENT            17-NOV-81       5000            10          1
          7782 CLARK      MANAGER     7839     09-JUN-81       2450            10          2
          7934 MILLER     CLERK       7782     23-JAN-82       1300            10          3
          7788 SCOTT      ANALYST     7566     19-APR-87       3000            20          1
          7902 FORD       ANALYST     7566     03-DEC-81       3000            20          1
          7566 JONES      MANAGER     7839     02-APR-81       2975            20          3
          7876 ADAMS      CLERK       7788     23-MAY-87       1100            20          4
          7369 SMITH      CLERK       7902     17-DEC-80        800            20          5
          7698 BLAKE      MANAGER     7839     01-MAY-81       2850            30          1
          7499 ALLEN      SALESMAN    7698     20-FEB-81       1600     300    30          2
          7844 TURNER     SALESMAN    7698     08-SEP-81       1500      0     30          3
          7521 WARD       SALESMAN    7698     22-FEB-81       1250     500    30          4
          7654 MARTIN     SALESMAN    7698     28-SEP-81       1250    1400    30          4
          8888 MARK       HAWKER      7698     28-SEP-81       1250    1400    30          4
          7900 JAMES      CLERK       7698     03-DEC-81        950            30          7
    

    dense_rank ( ) over (partition by … order by … )

    scott@DBHAWK>select t.*,dense_rank() over(partition by deptno order by sal desc) DENSERANK from emp t;
    
         EMPNO ENAME      JOB               MGR HIREDATE        SAL       COMM     DEPTNO  DENSERANK
    ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ----------
          7839 KING       PRESIDENT            17-NOV-81       5000            10          1
          7782 CLARK      MANAGER     7839     09-JUN-81       2450            10          2
          7934 MILLER     CLERK       7782     23-JAN-82       1300            10          3
          7788 SCOTT      ANALYST     7566     19-APR-87       3000            20          1
          7902 FORD       ANALYST     7566     03-DEC-81       3000            20          1
          7566 JONES      MANAGER     7839     02-APR-81       2975            20          2
          7876 ADAMS      CLERK       7788     23-MAY-87       1100            20          3
          7369 SMITH      CLERK       7902     17-DEC-80        800            20          4
          7698 BLAKE      MANAGER     7839     01-MAY-81       2850            30          1
          7499 ALLEN      SALESMAN    7698     20-FEB-81       1600     300    30          2
          7844 TURNER     SALESMAN    7698     08-SEP-81       1500      0     30          3
          7521 WARD       SALESMAN    7698     22-FEB-81       1250     500    30          4
          7654 MARTIN     SALESMAN    7698     28-SEP-81       1250    1400    30          4
          8888 MARK       HAWKER      7698     28-SEP-81       1250    1400    30          4
          7900 JAMES      CLERK       7698     03-DEC-81        950            30          5
    

    row_number () over (partition by … order by … )

    scott@DBHAWK>select t.*,row_number () over (partition by deptno order by sal desc)ROWNUMBER from emp t;
    
         EMPNO ENAME      JOB          MGR      HIREDATE        SAL       COMM     DEPTNO  ROWNUMBER
    ---------- ---------- --------- ---------- --------- ---------- ---------- ---------- ----------
          7839 KING       PRESIDENT            17-NOV-81       5000            10          1
          7782 CLARK      MANAGER     7839     09-JUN-81       2450            10          2
          7934 MILLER     CLERK       7782     23-JAN-82       1300            10          3
          7788 SCOTT      ANALYST     7566     19-APR-87       3000            20          1
          7902 FORD       ANALYST     7566     03-DEC-81       3000            20          2
          7566 JONES      MANAGER     7839     02-APR-81       2975            20          3
          7876 ADAMS      CLERK       7788     23-MAY-87       1100            20          4
          7369 SMITH      CLERK       7902     17-DEC-80        800            20          5
          7698 BLAKE      MANAGER     7839     01-MAY-81       2850            30          1
          7499 ALLEN      SALESMAN    7698     20-FEB-81       1600     300    30          2
          7844 TURNER     SALESMAN    7698     08-SEP-81       1500      0     30          3
          7521 WARD       SALESMAN    7698     22-FEB-81       1250     500    30          4
          7654 MARTIN     SALESMAN    7698     28-SEP-81       1250    1400    30          5
          8888 MARK       HAWKER      7698     28-SEP-81       1250    1400    30          6
          7900 JAMES      CLERK       7698     03-DEC-81        950            30          7
    

    min ( ) over (partition by … )
    max ( ) over (partition by … )

    scott@DBHAWK>select t.*,min(sal) over(partition by deptno)min_sal ,max(sal) over(partition by deptno)max_sal  from emp t;  
    
         EMPNO ENAME      JOB          MGR HIREDATE         SAL     COMM   DEPTNO MIN_SAL    MAX_SAL
    ---------- ---------- --------- ---------- --------- ---------- -----  ------ --------- ------------ 
          7782 CLARK      MANAGER     7839 09-JUN-81       2450            10       1300       5000
          7934 MILLER     CLERK       7782 23-JAN-82       1300            10       1300       5000
          7839 KING       PRESIDENT        17-NOV-81       5000            10       1300       5000
          7566 JONES      MANAGER     7839 02-APR-81       2975            20        800       3000
          7369 SMITH      CLERK       7902 17-DEC-80        800            20        800       3000
          7788 SCOTT      ANALYST     7566 19-APR-87       3000            20        800       3000
          7902 FORD       ANALYST     7566 03-DEC-81       3000            20        800       3000
          7876 ADAMS      CLERK       7788 23-MAY-87       1100            20        800       3000
          7521 WARD       SALESMAN    7698 22-FEB-81       1250     500    30        950       2850
          7844 TURNER     SALESMAN    7698 08-SEP-81       1500      0     30        950       2850
          7499 ALLEN      SALESMAN    7698 20-FEB-81       1600     300    30        950       2850
          7900 JAMES      CLERK       7698 03-DEC-81        950            30        950       2850
          8888 MARK       HAWKER      7698 28-SEP-81       1250    1400    30        950       2850
          7654 MARTIN     SALESMAN    7698 28-SEP-81       1250    1400    30        950       2850
          7698 BLAKE      MANAGER     7839 01-MAY-81       2850            30        950       2850

    lead(列名,n,m): 当前记录后面第n行记录的<列名>的值,没有则默认值为m;如果不带参数n,m,则查找当前记录后面第一行的记录<列名>的值,没有则默认值为null。
    lag(列名,n,m): 当前记录前面第n行记录的<列名>的值,没有则默认值为m;如果不带参数n,m,则查找当前记录前面第一行的记录<列名>的值,没有则默认值为null。

    select t.*,  
           lead(sal, 1, 0) over(partition by deptno order by sal) lead_sal,  
           lag(sal, 1, 0) over(partition by deptno order by sal) lag_sal,  
           nvl(lead(sal) over(partition by deptno order by sal) - sal,  
               0) diff_lead_sal,  
           nvl(sal - lag(sal) over(partition by deptno order by sal), 0) diff_lag_sal  
      from emp t;

    扩展使用

    select t.*,  
           first_value(sal) over(partition by deptno) first_sal,  
           last_value(sal) over(partition by deptno) last_sal,  
           sum(sal) over(partition by deptno) sum_sal,  
           avg(sal) over(partition by deptno) avg_sal,  
           count(sal) over(partition by deptno) count_num,  
           row_number() over(partition by deptno order by sal) row_num  
      from emp t;  
  • 相关阅读:
    【逆向】《0day安全-软件漏洞分析技术》实验笔记2
    【逆向】《0day安全-软件漏洞分析技术》实验笔记1
    WorkWithPlus 13.15 升级!列表对象的优化效果显著!
    「版本更新」Genexus 16 Upgrade 9已发布!
    下一波数字化转型来临,我们需要选择更智能的开发工具
    太棒!企业和程序员都高兴!2-3个月打造全栈工程师
    GeneXus中如何使用聊天机器人
    「版本更新」GeneXus16 Upgrade 8的特性
    看完视频我终于明白:资深架构师角度的技术架构是这样!
    数据报告和分析:Dashboard
  • 原文地址:https://www.cnblogs.com/hawk20110625/p/9309473.html
Copyright © 2011-2022 走看看