窗口函数等--天池龙珠计划SQL训练营

本文详细介绍了SQL中的窗口函数及其应用场景,包括PARTITION BY和ORDER BY的作用方式,以及如何利用这些函数进行动态数据分析。此外,还讲解了如何使用ROLLUP计算分类小计和合计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.窗口函数

是一类函数集合,对数据库进行实时数据分析,有动态作用。

<窗口函数> OVER ([PARTITION BY <列名>]
                     ORDER BY <排序用列名>)  
  • 将SUM、MAX、MIN等聚合函数用在窗口函数中
  • RANK、DENSE_RANK等排序用的专用窗口函数

1.1 partition by

按照列名进行分组与group by类似,但是不进行聚合,即不改变行数。计算出每组的结果然后进行广播。
例子
计算出按照登记日期(regist_date)升序进行排列的各日期的销售单价(sale_price)的总额

select `product_name` , 
	 `regist_date` , 
	sum(sale_price)  over ( PARTITION   BY `regist_date` ) as sum_sale
from product;

计算出每天销售单价的累加和,直接求出一个结果,而不是动态求和。

1.2 order by

ORDER BY是用来排序,即决定窗口内,是按那种规则(字段)来排序的。
在没有 partition by时,会进行动态操作.

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;  

在这里插入图片描述
可用来计算移动平均,并且指定移动平均范围.

<窗口函数> OVER (ORDER BY <排序用列名>
                 ROWS n PRECEDING )  
                 
<窗口函数> OVER (ORDER BY <排序用列名>
                 ROWS BETWEEN n PRECEDING AND n FOLLOWING)
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  

2. 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  

在这里插入图片描述
可以起到与 partition类似功能,不过会新增行数。

注意事项

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值