zoukankan      html  css  js  c++  java
  • SQLServer 窗口函数

    一、窗口函数的作用

      窗口函数是对一组值进行操作,不需要使用GROUP BY 子句对数据进行分组,还能够在同一行中同时返回基础行的列和聚合列。窗口函数,基础列和聚合列的查询都非常简单。

    二、语法格式

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

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

      首先建一张调试表如下:

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

      往里面添加如下数据。

      

    三、应用场景

      1、聚合列与数据列共同显示

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

      

      2、分组日期最新

    --对每个人查询日期最新列
    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

      3、分页

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

    四、排名函数

      1、ROW_NUMBER()

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

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

       输出如下:

      

      2、RANK()

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

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

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

      

      3、DENSE_RANK()

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

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

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

      

      4、NTILE()

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

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

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

      示例如下:

      

     
     
     
    0
    0
     
    (请您对文章做出评价)
     
    « 上一篇:jQuery插件开发方式
    » 下一篇:SVN 记录冲突、忽略
  • 相关阅读:
    自定义分页二
    CheckBox实现跨页面多选
    正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。
    DropDownList下拉框多选
    通用查询
    AutoCAD自动加载DLL文件的方法
    软件开发(团队管理)
    正确地做事与做正确的事
    C#.NET实现邮件的发送
    多附件的上传
  • 原文地址:https://www.cnblogs.com/mingxuantongxue/p/4425382.html
Copyright © 2011-2022 走看看