一、窗口函数的作用

  窗口函数是对一组值进行操作,不需要使用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

  示例如下:

  

SQLServer 窗口函数的更多相关文章

  1. SQLServer 窗口函数(转载)

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

  2. 「数据分析」Sqlserver中的窗口函数的精彩应用-问题篇

    最近看到PowerBI圈子在讨论最大连续区间段的问题,即某人最大的全勤时间,某人的最长的连续打卡时间等问题的计算,佐罗老师给出了10万倍性能的答案.这个问题也引发了笔者一些兴趣,隐约记得以前看过Sql ...

  3. 个人永久性免费-Excel催化剂功能第37波-把Sqlserver的强大分析函数拿到Excel中用

    本人一直钟情于使用Sqlserver数据库的一大原因是其提供了非常好用.高效的数据分析函数(窗口函数),可以在做数据清洗和数据分析场合等多个场景使用.只需简单的一个函数即可做出常规SQL语句很难以实现 ...

  4. 「数据分析」Sqlserver中的窗口函数的精彩应用之数据差距与数据岛(含答案)

    上一篇介绍过数据差距与数据岛的背景,这里不再赘述,请翻阅上一文.此篇在Sqlserver上给大家演示1000万条记录的计算性能. 测试电脑软硬件说明 一般般的笔记本电脑,2017年7月,价格:4500 ...

  5. SqlServer三种常用窗口函数

    插入数据 ,),(,),(,),(,),(,),(,),(,) ⒈rank()over,跳跃排序,允许并列,并在发生并列时保留名次空缺. select rank() over(order by sco ...

  6. sqlserver每行都有累加,你怎么搞,窗口函数来帮忙!!!

          在统计中我们经常会面临复杂的查询,例如累加,最近也遇到一个很好的例子,今天我们一起来看看:       有一个关于销售数据的视图,字段有:emptyid(员工编号),ordermonth( ...

  7. SQLSERVER中的假脱机spool

    SQLSERVER中的假脱机spool 我发现网上对于假脱机的解释都非常零散,究竟假脱机是什么? 这几天在家里研究了一下,收集了很多网上的资料 假脱机是中文的翻译,而英文的名字叫做 spool 在徐老 ...

  8. PostgreSQL>窗口函数的用法

    PostgreSQL之窗口函数的用法 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9311281.html PostgreSQL的高级特性本准备三篇的(递归. ...

  9. 解剖SQLSERVER 第一篇 数据库恢复软件商的黑幕(有删减版)

    解剖SQLSERVER 第一篇  数据库恢复软件商的黑幕(有删减版) 这一系列,我们一起来解剖SQLSERVER 在系列的第一篇文章里本人可能会得罪某些人,但是作为一位SQLSERVER MVP,在我 ...

随机推荐

  1. SecureCRT自动登录

  2. 一个原生的JavaScript拖动方法

    代码: 1 function drag(t,p){ 2 3 var point = p || null, 4 target = t || null, 5 resultX = 0, 6 resultY ...

  3. [JS]Javascript的函数总结

    Javascript中不存在函数重载,同名的函数将被最后一个覆盖. function test(a,b){ this.x = 1;} function test(a){ this.x = 2;} fu ...

  4. php 信号量

    一些理论基础: 信号量:又称为信号灯.旗语 用来解决进程(线程同步的问题),类似于一把锁,访问前获取锁(获取不到则等待),访问后释放锁. 临界资源:每次仅允许一个进程访问的资源. 临界区:每个进程中访 ...

  5. 用happen-before规则重新审视DCL(转)

    编写Java多线程程序一直以来都是一件十分困难的事,多线程程序的bug很难测试,DCL(Double Check Lock)就是一个典型,因此对多线程安全的理论分析就显得十分重要,当然这决不是说对多线 ...

  6. http请求的referer属性

    HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理.比如从我主页上链 ...

  7. block作为类的属性时用copy

    1. block作为类的属性时用copy Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的 <栈 :由系统维护的局 ...

  8. 客户端获取服务端自定义类数据 z

    客户端获取服务端自定义类数据 问题一:超时问题,在最后获取数据的时候突然提示服务超时,服务已断开 解决:配置文件添加: <bindings> <wsHttpBinding> & ...

  9. Ubuntu下启动Apache的Rewrite功能

    在终端中执行 sudo a2enmod rewrite 指令后,即启用了 Mod_rewrite 模块. 另外,也可以通过将 /etc/apache2/mods-available/rewrite.l ...

  10. jquery ui datepicker中文显示

    $.datepicker.regional['zh-CN'] = { closeText: '关闭', prevText: '<上月', nextText: '下月>', currentT ...