SQL窗口函数学习

本文主要学习自:https://blog.csdn.net/qq_41805514/article/details/81772182

窗口函数可以进行排序,生成序列号等一般的聚合函数无法实现的高级操作。
窗口函数也称为OLAP函数,意思是对数据库数据进行实时分析处理。窗口函数就是为了实现OLAP而添加的标准SQL功能。
窗口函数语法:其中[]中的内容可以省略

<窗口函数> over ([partition by <列清单>]
                        order by <排序用列清单>)

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

  1. 能够作为窗口函数的聚合函数(sum,avg,count,max,min)
  2. rank,dense_rank。row_number等专用窗口函数。

语法的基本使用方法:使用rank函数

rank函数是用来计算记录排序的函数。

select product_name, product_type, sale_price,
rank () over (partition by product_type
order by sale_price) as ranking
from Product;

在这里插入图片描述
partition by 能够设定排序的对象范围,类似于group by语句,这里就是以product_type划分排序范围。

order by能够指定哪一列,何种顺序进行排序。也可以通过asc,desc来指定升序降序。

窗口函数兼具分组和排序两种功能。通过partition by分组后的记录集合称为窗口。

然而partition by不是窗口函数所必须的:

select product_name, product_type, sale_price,
rank () over (order by sale_price) as ranking
from Product;

在这里插入图片描述
没有进行范围的划分,直接对全部的商品进行排序。

专用函数的种类:
1.rank函数:计算排序时,如果存在相同位次的记录,则会跳过之后的位次。
2.dense_rank函数:同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次。
3.row_number函数:赋予唯一的连续位次。

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;

在这里插入图片描述
由于窗口函数无需参数,因此通常括号里都是空的。

窗口函数的适用范围:只能在select子句中使用。

作为窗口函数使用的聚合函数:

sum:

select product_id, product_name, sale_price,
sum(sale_price) over (order by product_id) as current_sum
from Product;

在这里插入图片描述
以累计的方式进行计算。

计算出商品编号小于自己的商品的销售单价的合计值。

avg:

select product_id, product_name, sale_price,
avg(sale_price) over (order by product_id) as current_sum
from Product;

在这里插入图片描述
作为的统计对象同样是排在自己之上的记录。

1行:1000/1

2行:(1000 + 500)/2

3行:(1000+500+4000)/3

计算移动平均

窗口函数就是将表以窗口为单位进行分割,并在其中进行排序的函数。其中还包含在窗口中指定更加详细的汇总范围的备选功能,该备选功能中的汇总范围称为框架。

指定最靠近的3行做为汇总对象:

select product_id, product_name, sale_price,
avg (sale_price) over (order by product_id
rows 2 preceding) as moving_avg
from Product;

指定框架(汇总范围):这里使用的rows(行)和preceding(之前)两个关键字,将框架指定为截止到之前?行,因此rows 2 preceding就是将框架指定为截止到之前2行,也就是将作为汇总对象的记录限定为如下的最靠近3行

1.自身(当前记录)

2.之前1行的记录

3.之前2行的记录

所以结果:
在这里插入图片描述
假设当前行为3000,前1行记录为4000,前两行记录为500,所以(500+4000+3000)/3=2500
在这里插入图片描述
这样的统计方法称为移动平均。

使用关键字following(之后)替换preceding,就可以将框架改为截止到之后?行。

将当前记录的前后行作为汇总对象:

select product_id, product_name, sale_price,
avg(sale_price) over (order by product_id
rows between 1 preceding and 1 following) as moving_avg--使用between规划范围,语句意思为rows 1 preceding
--到rows 1 following
from Product;

语句意思:
1.之前1行的记录
2.自身(当前记录)
3.之后1行的记录

整的框架就是这样
在这里插入图片描述
还是假设3000为当前记录,框架计算4000为前一行记录,6800为后一行记录(4000+3000+6800)/3 = 4600

总行数还是3.

两个order by

select product_name, product_type, sale_price,
rank() over (order by product_name) as ranking
from Product;

在这里插入图片描述
这时候价格会显得混乱不堪

可以在语句最后添加一个order by子句,来约束sale_price

select product_name, product_type, sale_price,
rank() over (order by product_name) as ranking
from Product
order by sale_price;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: SQL窗口函数有一些高级用法。首先,窗口函数通常只能在SELECT子句中使用,并且窗口函数中的ORDER BY子句不会影响最终结果的排序,它只是用来确定窗口函数的计算顺序。其次,窗口函数可以使用GROUPING运算符来计算合计和小计。其中,ROLLUP是一种常用的GROUPING运算符,用于计算合计和小计。\[1\]\[2\] 窗口函数的语法如下: <窗口函数> OVER (ORDER BY <排序用列名> ROWS n PRECEDING) <窗口函数> OVER (ORDER BY <排序用列名> ROWS BETWEEN n PRECEDING AND n FOLLOWING) 这些语法可以用来指定窗口函数的排序方式和计算范围。例如,可以使用ROWS BETWEEN子句来指定窗口函数计算的范围,如"ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING"表示计算当前行及其前后一行的窗口函数值。\[2\]\[3\] 总之,SQL窗口函数的高级用法包括使用ORDER BY子句确定计算顺序,使用GROUPING运算符计算合计和小计,以及使用ROWS BETWEEN子句指定计算范围。这些用法可以帮助我们更灵活地使用窗口函数进行数据分析和计算。 #### 引用[.reference_title] - *1* [SQL学习——窗口函数](https://blog.csdn.net/luschka/article/details/114333624)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【SQL】(task5)SQL高级处理(窗口函数 | ROLLUP)](https://blog.csdn.net/qq_35812205/article/details/121425049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值