datawhale9月组队学习task05SQL高级操作

Posted 临风而眠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了datawhale9月组队学习task05SQL高级操作相关的知识,希望对你有一定的参考价值。

datawhale9月组队学习task05 SQL高级操作

一.窗口函数

1.概念、基本使用方法

  • 窗口函数(OLAP函数)

    • Online AnalyticalProcessing
    • 对数据库进行实时分析处理
  • 窗口函数可以让我们有选择的对某一部分数据进行汇总、计算和排序

    • 常规的SELECT语句是对整张表进行查询的
  • 通用形式

    <窗口函数> OVER ([PARTITION BY <列名>]
                         ORDER BY <排序用列名>)  
    
    • []中的内容可省略
    • PARTITION BY
      • 用于分组:选择要看哪个窗口
        • 类似于GROUP BY子句的分组功能,但是PARTITION BY子句不具备GROUP BY子句的汇总功能,不会改变原始表中记录的行数
    • ORDER BY
      • 用于排序:决定窗口内,是按哪种规则(字段)来排序
  • SELECT product_name
           ,product_type
           ,sale_price
           ,RANK() OVER (PARTITION BY product_type
                             ORDER BY sale_price) AS ranking
      FROM product;
    
    • 运行结果

    • PARTITION BY 能够设定窗口对象范围

      • 上面指定了product_type使之按照商品种类进行排序,即一个商品种类就是一个小的"窗口"、
    • ORDER BY 能够指定按照哪一列、何种顺序进行排序

      • 上面指定了sale_price,使之按照销售单价的升序进行排列

        ​ 窗口函数中的ORDER BY与SELECT语句末尾的ORDER BY一样,可以通过关键字ASC/DESC来指定升序/降序。省略该关键字时会默认按照ASC,也就是升序进行排序。本例中就省略了上述关键字

二.窗口函数种类

  • 大致两类
    • 使用了聚合函数的窗口函数
      • 如SUM MAX MIN等聚合函数
    • 排序用的专用窗口函数
      • RANK DENSE_RANK

1.专用窗口函数

SELECT product_name,
       product_type,
       sale_price,
       RANK() OVER (ORDER BY  sale_price) AS ranking,
       DENSE_RANK() OVER (ORDER BY sale_price) AS dense_ranking,
       ROW_NUMBER() OVER (ORDER BY sale_price) AS row_num
FROM product;

不写rank的话,表头会有点长

2.聚合函数在窗口函数上的使用

  • 聚合函数在开窗函数中的使用方法和之前的专用窗口函数一样,只是出来的结果是一个累计的聚合函数值

  • SELECT  product_id
           ,product_name
           ,sale_price
           ,SUM(sale_price) OVER (ORDER BY product_id) AS current_sum
           ,AVG(sale_price) OVER (ORDER BY product_id) AS current_avg
      FROM product;
    

  • 可以看出,聚合函数结果是,按我们指定的排序,这里是product_id,当前所在行及之前所有的行的合计或均值。即累计到当前行的聚合

三.窗口函数的应用-计算移动平均

  • 上面提到,聚合函数在窗口函数使用时,计算的是累积到当前行的所有的数据的聚合。 实际上,还可以指定更加详细的汇总范围。该汇总范围成为框架(frame)

  • 语法

    <窗口函数> OVER (ORDER BY <排序用列名>
                     ROWS n PRECEDING )  
                     
    <窗口函数> OVER (ORDER BY <排序用列名>
                     ROWS BETWEEN n PRECEDING AND n FOLLOWING)
    
    • PRECEDING(“之前”)
      • 将框架指定为 “截止到之前 n 行”,加上自身行
    • FOLLOWING(“之后”)
      • 将框架指定为 “截止到之后 n 行”,加上自身行
    • BETWEEN 1 PRECEDING AND 1 FOLLOWING
      • 将框架指定为 “之前1行” + “之后1行” + “自身”
  • SELECT  product_id
           ,product_name
           ,sale_price
           ,AVG(sale_price) OVER (ORDER BY product_id
                                   ROWS 2 PRECEDING) AS moving_avg
           ,AVG(sale_price) OVER (ORDER BY product_id
                                   ROWS BETWEEN 1 PRECEDING 
                                            AND 1 FOLLOWING) AS moving_avg  
      FROM product;  
    

注意事项

四.GROUPING 运算符

计算合计及小计

  • 常规的GROUP BY 只能得到每个分类的小计,有时候还需要计算分类的合计,可以用 ROLLUP关键字

  • SELECT  product_type
           ,regist_date
           ,SUM(sale_price) AS sum_price
      FROM product
     GROUP BY product_type, regist_date WITH ROLLUP;  
    

以上是关于datawhale9月组队学习task05SQL高级操作的主要内容,如果未能解决你的问题,请参考以下文章

datawhale9月组队学习task06 SQL秋招题

datawhale9月组队学习task01环境搭建,初始数据库

datawhale9月组队学习task03复杂查询

datawhale9月组队学习task04集合运算

Datawhale7月组队学习task3数据重构

Datawhale7月组队学习task5模型建立和评估