窗口函数能够进行排序,生成序列号等通常的聚合函数没法实现的高级操做。数据库
窗口函数也称为OLAP函数,意思是对数据库数据进行实时分析处理。窗口函数就是为了实现OLAP而添加的标准SQL功能。框架
窗口函数语法:其中[]中的内容能够省略函数
使用格式: <窗口函数> over ([partition by <列清单>] order by <排序用列清单>)spa
窗口函数大致能够分为如下两种:3d
1.可以做为窗口函数的聚合函数(sum,avg,count,max,min)code
2.rank,dense_rank。row_number等专用窗口函数。对象
语法的基本使用方法:使用rank函数blog
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划分排序范围。it
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;