加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

每日一得--SQLServer 窗口函数(OVER、PARTITION BY)

发布时间:2020-12-12 13:28:23 所属栏目:MsSql教程 来源:网络整理
导读:一、窗口函数的作用 窗口函数是对一组值进行操作,不需要使用GROUP BY 子句对数据进行分组,还能够在同一行中同时返回基础行的列和聚合列。窗口函数,基础列和聚合列的查询都非常简单。 二、语法格式 窗口函数的语法格式如下: 1 OVER([PARTITION? BY ? valu
1 OVER([PARTITION?BY? value_expression,..[n]?]?<ORDER? BY_Clause>)
  • PARTITION:分组;

  • ORDER BY:排序;

首先建一张调试表如下:

1 2 3 4 5 6 CREATE? TABLE? [dbo].[xxx]([Id]?[int]?NULL,[Name]?[nvarchar](50)?[Operate]?[nvarchar](50)?[Score]?[[CreateTime]?[datetime]?)?ON? PRIMARY]

往里面添加如下数据。

三、应用场景


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

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

SELECT? *? ( ???? row_number()?OVER(PARTITION? BY? Name? CreateTime)? AS? part?,Score,? xxx CWHERE?C.part?=?1

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

四、排名函数


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

CreateTime)?,monospace!important; border:0px!important; bottom:auto!important; float:none!important; height:auto!important; left:auto!important; line-height:1.1em!important; margin:0px!important; outline:0px!important; overflow:visible!important; padding:1px 0px!important; position:static!important; right:auto!important; top:auto!important; vertical-align:baseline!important; width:auto!important; font-size:1em!important; min-height:auto!important; color:black!important; background:none!important'>xxx

输出如下:

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

RANK()?OVER(PARTITION?SCORE)?,51); font-size:14px; line-height:30px'>   下面一张图片很好地说明了Rank与ROW_NUMBER的区别。

  

  3、DENSE_RANK()

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

SELECT?DENSE_RANK()?OVER(PARTITION?BY?Name?ORDER?BY?SCORE)?,?Name,?CreateTimeFROM?xxx

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

  

  4、NTILE()

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

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

--每个分区分2个组,该列是改行所属的组名SELECT?NTILE(2)?OVER(PARTITION?BY?Name?ORDER?BY?SCORE)?,51); font-size:14px; line-height:30px'>   示例如下:

  

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

一、窗口函数的作用


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

二、语法格式


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