SQLServer 窗口函数

1、窗口函数的做用

  窗口函数是对一组值进行操做,不须要使用GROUP BY 子句对数据进行分组,还可以在同一行中同时返回基础行的列和聚合列。窗口函数,基础列和聚合列的查询都很是简单。express

2、语法格式

  窗口函数的语法格式以下:函数

OVER([PARTITION BY value_expression,..[n] ] <ORDER BY BY_Clause>)
  • PARTITION:分组;
  • ORDER BY:排序;

  首先建一张调试表以下:spa

CREATE TABLE [dbo].[xxx](
  [Id] [int] NULL,
  [Name] [nvarchar](50) NULL,
  [Operate] [nvarchar](50) NULL,
  [Score] [int] NULL,
  [CreateTime] [datetime] NULL
) ON [PRIMARY]

  往里面添加以下数据。调试

  

3、应用场景

  一、聚合列与数据列共同显示code

 --查询姓名、分数、以及全体平均分
 SELECT Name, Score, CAST(AVG(Score) OVER() AS decimal(5,2) )AS '平均分' FROM xxx

  

  二、分组日期最新blog

--对每一个人查询日期最新列
SELECT * FROM 
(
    SELECT row_number() OVER(PARTITION BY Name ORDER BY CreateTime) AS part ,Score, Name, CreateTime FROM xxx
) AS C
WHERE C.part = 1

 

  三、分页排序

  返回结果集内的行号,每一个分区从1开始,ORDER BY可肯定在特定分区中为行分配惟一 ROW_NUMBER 的顺序。图片

4、排名函数

  一、ROW_NUMBER()ci

  返回结果集内的行号,每一个分区从1开始计算,ORDER BY可肯定在特定分区中为行分配惟一 ROW_NUMBER 的顺序。io

    SELECT row_number() OVER(PARTITION BY Name ORDER BY CreateTime) ,Score, Name, CreateTime
    FROM xxx

   输出以下:

  

  二、RANK()

  返回结果集的分区内每行的排序。行的排名是从1开始算。若是两个或多个行与一个排名关联,则每一个关联行将获得相同的排名。

  SELECT RANK() OVER(PARTITION BY Name ORDER BY SCORE) ,Score, Name, CreateTime
  FROM xxx

  下面一张图片很好地说明了Rank与ROW_NUMBER的区别。

  

  三、DENSE_RANK()

  返回结果集分区中行的排名,与Rank()相似,只是对并列的处理稍有不一样,详见示例。

SELECT DENSE_RANK() OVER(PARTITION BY Name ORDER BY SCORE) ,Score, Name, CreateTime
FROM xxx

  下面的示例展现了Rank()与Dense_Rank()的区别。

  

  四、NTILE()

   NTILE函数把结果中的行关联到组,并为每一行分配一个所属的组的编号,编号从1开始。对于每个行,NTILE 将返回此行所属的组的编号。

  若是分区的行数不能被 integer_expression(就是传入的那个参数,表示分几个组的意思) 整除,则将致使一个成员有两种大小不一样的组。按照 OVER 子句指定的顺序,较大的组排在较小的组前面。

--每一个分区分2个组,该列是改行所属的组名
SELECT NTILE(2) OVER(PARTITION BY Name ORDER BY SCORE) ,Score, Name, CreateTime
FROM xxx

  示例以下:

  

相关文章
相关标签/搜索