SQL-常用函数第七集-分析函数重点

6次阅读

共计 1976 个字符,预计需要花费 5 分钟才能阅读完成。

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

  • 和 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;


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

1.FUNCTION_NAME(< 参数 >,…) OVER (PARTITION BY 表达式,…)         -- 分组求值
2.FUNCTION_NAME(< 参数 >,…) OVER (ORDER BY 表达式 <ASC DESC>)    -- 整体数据未做分组, 先排序, 在求累计求值
3.FUNCTION_NAME(< 参数 >,…) OVER (PARTITION BY 表达式,… ORDER BY 表达式 <ASC DESC>) -- 先分组, 按组内排序, 对组内求累计求值
    
    
    -- 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;

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

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

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


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;

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

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

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

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


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; 

正文完
 0