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行” + “自身”
- PRECEDING(“之前”)
-
例
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高级操作的主要内容,如果未能解决你的问题,请参考以下文章