SQL窗口函数2019-06-24

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个人当中请病假最长时间的人。

你可能感兴趣的:(SQL窗口函数2019-06-24)