天池龙珠计划-SQL训练营-task05打卡

1. 知识点补全

1.1 聚合函数在窗口函数上的使用

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

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;  

在这里插入图片描述
在这里插入图片描述

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

还可以指定更加详细的汇总范围。该汇总范围成为框架(frame)。
语法:

<窗口函数> OVER (ORDER BY <排序用列名>
                 ROWS n PRECEDING )  
                 
<窗口函数> OVER (ORDER BY <排序用列名>
                 ROWS BETWEEN n PRECEDING AND m FOLLOWING)

PRECEDING(“之前”), 将框架指定为 “截止到之前 n 行”,加上自身行

FOLLOWING(“之后”), 将框架指定为 “截止到之后 m 行”,加上自身行

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  

执行结果:

注意观察框架的范围。

ROWS 2 PRECEDING:

在这里插入图片描述

ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING:

1.3 GROUPING运算符

1.3.1 ROLLUP - 计算合计及小计

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

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

得到的结果为:
在这里插入图片描述

2. 练习题

2.1 请说出针对本章中使用的product(商品)表执行如下 SELECT 语句所能得到的结果。

SELECT  product_id
       ,product_name
       ,sale_price
       ,MAX(sale_price) OVER (ORDER BY product_id) AS Current_max_price
  FROM product

答:
按照 product_id 升序排列,计算出截⾄当前⾏的最⾼价格 sale_price;

2.2 继续使用product表,计算出按照登记日期(regist_date)升序进行排列的各日期的销售单价(sale_price)的总额。排序是需要将登记日期为NULL 的“运动 T 恤”记录排在第 1 位(也就是将其看作比其他日期都早)

select regist_date, 
	product_name, 
	sale_price,
	sum(sale_price) 
		over(order by regist_date nulls first) as current_sum_price
from product;

2.3 思考题

① 窗口函数不指定PARTITION BY的效果是什么?

答:排序列进行全局配列

② 为什么说窗口函数只能在SELECT子句中使用?实际上,在ORDER BY 子句使用,系统并不会报错。

答:
本质上是因为 SQL 语句的执⾏顺序。
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
如果在 WHERE, GROUP BY, HAVING 使⽤了窗⼝函数,就是说提前进⾏了⼀次排序,排序之后再去除记录、汇总、汇总过滤,第⼀次排序结果就是错误的,没有实际意义。
⽽ ORDER BY 语句执⾏顺序在SELECT 语句之后,⾃然是可以使⽤的。

猜你喜欢

转载自blog.csdn.net/Keeomg/article/details/114239591