SqlServer笔记-窗口函数【未完成】

使用场景:

得到部门中工资排名前N名的员工列表;查找各部门每人工资占部门总工资的百分比。

对于这些场景,使用传统SQL实现比较困难,这类需求有一个共同特点就是需要在满足某些条件的记录集内部做一些函数操作,不是简单的表连接、聚合就可以实现。

要解决此类问题,最方便的方式就是使用窗口函数。

窗口:

窗口的概念非常重要,它可以理解为记录集合,窗口函数也就是在满足某种条件的记录集合上执行的特殊函数。对于每条记录都要在此窗口内执行函数,有的函数随着记录不同,窗口大小都是固定的,这种属于静态窗口;有的函数则相反,不同的记录对应着不同的窗口,这种动态变化的窗口叫滑动窗口。

窗口函数语法:

<窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名>)

窗口函数简单例子:

下面例子中, row_number()over(partition by user_no order by amount desc) 这部分都属于窗口函数,它的功能是显示每个用户按照订单金额从大到小排序的序号。

窗口函数有哪些:

1) 专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。

2) 聚合函数,如sum. avg, count, max, min等

因为窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中。

窗口函数具备了我们之前学过的group by子句分组的功能和order by子句排序的功能。那么,为什么还要用窗口函数呢?

这是因为,group by分组汇总后改变了表的行数,一行只有一个类别。而partiition by和rank函数不会减少原表中的行数。例如下面统计每个班级的人数。

现在我们说回来,为什么叫“窗口”函数呢?这是因为partition by分组后的结果称为“窗口”,这里的窗口不是我们家里的门窗,而是表示“范围”的意思。

 

 

over():开窗函数。

开窗函数就是在查询的总记录中使用记录的一部分进行操作。
在没有开窗函数时,select子句中如果出现聚合函数,就不能查看具体的记录信息,只能查看组的信息。开窗函数可以让我们同时查询聚合函数和组内记录。
over的意思是基于什么做运算,over后面表示一个范围,如果是空括号 over (),表示基于查询出的所有记录

案例1:在总记录中添加统计函数,不需要group by
select name,count(*) over() as 总数 from tb_promocodenew where id<5000
案例2:查看订单信息,并显示当前用户的总订单金额
select id,UserID,sum(TotalPrice) over (partition by UserID) as 当前用户总金额 from tb_promocodenew where id<5000;
案例3:行号
select*,ROW_NUMBER() Over(order by ID) as rowId from tb1
案例4:显示多组行号,按codeClass分组显示行号:
select name,CodeClass
,sum(CodeValue) over (partition by CodeClass)
,ROW_NUMBER() over (partition by codeClass order by name) 
from tb_promocodenew where id<5000;

参考:

MySQL窗口函数:https://www.cnblogs.com/DataArt/p/9961676.html

https://www.toutiao.com/i6763168115615334925/

原文地址:https://www.cnblogs.com/fanfan-90/p/12121291.html