1、sql窗口函数
宋桑:https://www.cnblogs.com/CareySon/p/3411176.html
窗口函数:也被称为OLAP函数或分析函数。在当前查询结果后面再加列,但行数还是查询出的行数。在当前查询结果窗口再执行的语句,所以称为窗口函数吧。
整个语句格式:
select 列1,列2,窗口函数 from 表1
窗口函数格式:
函数()over(partition by ** order by***desc 窗口字句)as 列别名
可以对于窗口函数使用分析函数、聚合函数和排名函数
特点:
1、输入行等于输出行
2、类似Group By的聚合
3、非顺序的访问数据
4、可以对于窗口函数使用分析函数、聚合函数和排名函数
5、简化了SQL代码(消除Join)
6、消除中间表
7、提高性能
partition by:
Partition By子句也可以称为查询分区子句,非常类似于Group By,都是将数据按照边界值分组,而Over之前的函数在每一个分组之内进行,如果超出了分组,则函数会重新计算,比如图2中的例子,我们将数据分为男性和女性两部分,前面的Count()函数针对这两组分别计算值(男性206,女性84)。
针对Partition By可以应用的函数不仅仅是我们所熟知的聚合函数,以及一些其他的函数,比如说Row_Number()。
Row_Number() over (order by 列1) as rowRank
order by:
Order By子句是另一类子句,会让输入的数据强制排序(文章前面提到过,窗口函数是SQL语句最后执行的函数,因此可以把SQL结果集想象成输入数据)。Order By子句对于诸如Row_Number(),Lead(),LAG()等函数是必须的,因为如果数据无序,这些函数的结果就没有任何意义。因此如果有了Order By子句,则Count(),Min()等计算出来的结果就没有任何意义。
row_number():排序,从1不断递增
lead():访问当前行下N行
lag():访问当前行上N行 lag(列名,n,无上一行的默认值)
first_value(列名)第一个值
窗口子句:
前面窗口的函数的作用范围是整个表,或是整个Partition by后面的分区。但是使用了窗口子句我们可以控制输入到窗口函数的数据集(前面说过,窗口函数是整个语句中最后执行的)的范围。
但是如果我们希望把输入数据集的粒度由Partition变为更细的话,我们可以使用窗口子句,让窗口函数仅仅根据当前行的前N行和后N行计算结果,那我们可以使用窗口子句,如图8所示,图8中,我们排序后,仅仅根据当前行的前一行和后一行以及当前行来计算这3个人当中请病假最长时间的人。
网友评论