• 分析函数


    分析函数又名窗口函数,也叫OLAP函数(OnLine Analytical Processing)意思是对数据库数据进行实时分析处理。

    语法:

        <窗口函数> OVER ([PARTITION BY <列清单>] ORDER BY <排序用列清单>)

    窗口函数大体可以分为以下两种

      ① 能够作为窗口函数的聚合函数(SUM、AVG、COUNT、MAX、MIN)
      ② RANK、DENSE_RANK、ROW_NUMBER 等专用窗口函数

      

    ⚪RANK函数——用来计算记录排序

      PARTITION BY 能够设定排序的对象范围。

      ORDER BY 能够指定按照哪一列、何种顺序进行排序。可以通过关键字ASC/DESC 来指定升序和降序。省略该关键字时会默认按照ASC,也就是升序进行排序。

      小结:PARTITION BY 在横向上对表进行分组,而ORDER BY决定了纵向排序的规则。

    窗口函数兼具之前我们学过的GROUP BY 子句的分组功能以及ORDER BY 子句的排序功能。但是,PARTITION BY 子句并不具备GROUP BY 子句的汇总功能

    通过PARTITION BY 分组后的记录集合称为窗口。此处的窗口并非“窗户”的意思,而是代表范围。各个窗口在定义上绝对不会包含共通的部分。

    无需指定PARTITION BY的情况

    PARTITION BY 并不是必需的,即使不指定也可以正常使用窗口函数。

    当不指定PARTITION BY 时,和使用没有GROUP BY 的聚合函数时的效果一样,也就是将整个表作为一个大的窗口来使用。

    ● RANK函数
    计算排序时,如果存在相同位次的记录,则会跳过之后的位次
    例)有3 条记录排在第1 位时:1 位、1 位、1 位、4 位……

    ● DENSE_RANK函数
    同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次
    例)有3 条记录排在第1 位时:1 位、1 位、1 位、2 位……

    ● ROW_NUMBER函数
    赋予唯一的连续位次
    例)有3 条记录排在第1 位时:1 位、2 位、3 位、4 位……

    使用RANK 或ROW_NUMBER 时无需任何参数,只需要像RANK ()或者ROW_NUMBER() 这样保持括号中为空就可以了。这也是专用窗口函数通常的使用方式,请大家牢记。

    窗口函数只能书写在SELECT 子句之中,不能在WHERE 子句或者GROUP BY 子句中使用。

    以“自身记录(当前记录)”作为基准进行统计,就是将聚合函数当作窗口函数使用时的最大特征。

  • 相关阅读:
    CF666E. Forensic Examination
    bzoj1396 识别子串
    bzoj2839 集合计数
    unknown
    Hibernate中一级缓存和二级缓存
    亲, 我们来再重申一遍"=="和"equals的区别
    BigDecimal类
    序列化详解
    利用简单的参数传递来实现单条查询的easyui-datagrid
    Oracl 动态执行表不可访问,本会话的自动统计被禁止
  • 原文地址:https://www.cnblogs.com/philipchan/p/14338616.html
Copyright © 2020-2023  润新知