在SQL SERVER 2005/2008支持两种排名开窗函数和聚集开窗函数。
一、 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子句> ] )