SQLserver的ROW_NUMBER() OVER( [ PARTITION BY ... ] [ ORDER BY ... ] )解释

一、 OVER() 函数

语法结构:OVER( [ PARTITION BY … ] [ ORDER BY … ] )

[1] PARTITION BY 子句进行分组;

[2] PARTITION BY 子句进行排序。

窗口函数OVER()指定一组行,开窗函数计算从窗口函数输出的结果集中各行的值。

开窗函数不需要使用GROUP BY就可以对数据进行分组,还可以同时返回基础行的列和聚合列。

OVER()函数不能单独使用,必须跟在 排名函数 或 聚合函数后边。

二、排名开窗函数

ROW_NUMBER()、DENSE_RANK()、RANK()、NTILE()属于排名函数。

排名开窗函数可以单独使用ORDER BY 语句,也可以和PARTITION BY同时使用。

PARTITION BY用于将结果集进行分组,开窗函数应用于每一组。

ODER BY 指定排名开窗函数的顺序。

注意:在排名开窗函数中必须使用ORDER BY语句。

语法结构:排名函数 ( ) OVER ( [ <partition_by子句> ] <order_by子句> )

1、ROW_NUMBER():为每一组的行记录按顺序生成一个唯一的行号。

2、RANK()也为每一组的行生成一个序号,与ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如两个相同的行生成序号3,那么接下来会生成序号5。

3、DENSE_RANK()和RANK()类似,不同的是如果有相同的序号,那么接下来的序号不会间断。也就是说如果两个相同的行生成序号3,那么接下来生成的序号还是4。

4、NTILE (integer_expression) 按照指定的数目将数据进行分组,并为每一组生成一个序号。

三、聚合开窗函数

很多聚合函数都可以用作窗口函数的运算,如COUNT(),SUM(),AVG(),MAX(MIN()。

聚合开窗函数只能使用PARTITION BY子句或都不带任何语句,ORDER BY不能与聚合开窗函数一同使用。

如果窗口函数不使用PARTITION BY 语句的话,那么就是不对数据进行分组,聚合函数计算所有的行的值。

语法结构:聚合函数( ) OVER ( [ <partition_by子句> ] )

猜你喜欢

转载自blog.csdn.net/qq_42689281/article/details/84062024