【SQL 常用函数】第七集 分析函数(重点)

看完这章你会学习到以下内容:

  • 和group by 的区别
  • 分析的搭配(聚合,排序,位移)
  • ORDER BY 累计求和属性

    Q1: 和group by 分组有什么区别?
    A1:Over(Partition by)它可以在数据中进行分组然后
    计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值

SELECT E.DEPTNO,AVG(SAL) FROM EMP E 
       GROUP BY DEPTNO;
       
 
SELECT E.*, AVG(SAL)OVER(PARTITION BY DEPTNO) AS 平均工资
       FROM EMP E;

【SQL 常用函数】第七集 分析函数(重点)_第1张图片

【SQL 常用函数】第七集 分析函数(重点)_第2张图片


1.函数为聚合函数(AVG,SUM,COUNT)

1.FUNCTION_NAME(<参数>,…) OVER (PARTITION BY 表达式,… )         -- 分组求值
2.FUNCTION_NAME(<参数>,…) OVER (ORDER BY 表达式  )    -- 整体数据未做分组,先排序,在求累计求值
3.FUNCTION_NAME(<参数>,…) OVER (PARTITION BY 表达式,… ORDER BY 表达式  ) -- 先分组,按组内排序,对组内求累计求值
    
    
    -- PARTITION BY   1.查看员工表中员工信息以及对应部门的总人数
    /*
    SELECT * FROM EMP;
    SELECT DEPTNO, COUNT(1) FROM EMP GROUP BY DEPTNO;

    SELECT E.*, T.CNT
      FROM EMP E
      JOIN (SELECT DEPTNO, COUNT(1) AS CNT FROM EMP GROUP BY DEPTNO) T
        ON E.DEPTNO = T.DEPTNO;
    */
    SELECT E.*,
           COUNT(EMPNO) OVER (PARTITION BY DEPTNO) AS CNT
      FROM EMP E;
    
    -- ORDER BY       2.对员工表的工资从低到高排序,求累计应发放薪资
    SELECT E.*,
           SUM(SAL) OVER (ORDER BY SAL)
      FROM EMP E;
    区别
    SELECT E.*,
           SUM(SAL) OVER (ORDER BY SAL,EMPNO)
      FROM EMP E;

---- 按照每个部门的工资从高到低排序,计算每个部门的累计工资

-- PARTITION BY + ORDER BY   3.按照每个部门的工资从高到低排序,计算每个部门的累计工资
    SELECT E.*,
           SUM(SAL) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC)
      FROM EMP E;

【SQL 常用函数】第七集 分析函数(重点)_第3张图片

但如上图所示,有些累积的金额应该要跳转累加的,但依旧保留原值。
原因在分组同一个部门后,员工的工资相等,函数默合并为一类。

出现这种情况,我们要添加多一条字段进行排序如果薪酬相同的再按员工姓名排序

SELECT E.*,SUM(SAL) OVER (PARTITION BY DEPTNO ORDER BY SAL,EMPNO)
      FROM EMP E;

【SQL 常用函数】第七集 分析函数(重点)_第4张图片


2.函数为排序函数(ROW_NUMBER(),RANK(),DENSE_RANK())情况下:

①ROW_NUMBER: ROW_NUMBER函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。[顺序排序]
②RANK: RANK函数返回一个唯一的值,当碰到相同的数据时,此时所有相同数据的排名是一样的,同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。[跳跃排序]
③DENSE_RANK: DENSE_RANK函数返回一个唯一的值,当碰到相同数据时,此时所有相同数据的排名都是一样的。 同时会在最后一条相同记录和下一条不同记录的排名之间不空出排名。[同为合并,连续排序]

经典案例1 .将emp表按工资从高到低排序,并给出排名(排名不并列)

SELECT E.*,ROW_NUMBER() OVER (ORDER BY SAL DESC) AS 排名
      FROM EMP E;

【SQL 常用函数】第七集 分析函数(重点)_第5张图片

经典案例2 :按照员工部门分组, 给出工资从高到低的排名(排名不并列)

SELECT E.*,   ROW_NUMBER() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) AS 排名
      FROM EMP E;

【SQL 常用函数】第七集 分析函数(重点)_第6张图片

经典案例3:找出员工表每个部门的一条员工信息

SELECT * 
    FROM ( 
      SELECT E.*,
         ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY EMPNO) AS RN
      FROM EMP E
      ) T
  WHERE T.RN = 1;

【SQL 常用函数】第七集 分析函数(重点)_第7张图片


3.位移函数(LEAD上移(列,参数), LAG下移(列,参数) )

经典案例:员工表按入职先后排序, 求出每两个员工的入职时间差

SELECT E.*,
       LAG(HIREDATE,1) OVER (ORDER BY HIREDATE) AS 下移,
       LEAD(HIREDATE,1) OVER (ORDER BY HIREDATE) AS 上移,
       LEAD(HIREDATE,1) OVER (ORDER BY HIREDATE) - HIREDATE AS 入职时间差
  FROM EMP E; 

【SQL 常用函数】第七集 分析函数(重点)_第8张图片

你可能感兴趣的:(oracle)