sqlserver的over开窗函数(与排名函数或聚合函数一起使用)

首先初始化表和数据

 1 create table t_student(
 2   Id INT,
 3   Name varchar(100),
 4   Score int,
 5   ClassId INT
 6 );
 7
 8 insert into t_student values (1,‘A‘,75,1);
 9 insert into t_student values (2,‘B‘,78,2);
10 insert into t_student values (3,‘C‘,74,1);
11 insert into t_student values (4,‘D‘,85,2);
12 insert into t_student values (5,‘E‘,80,1);
13 insert into t_student values (6,‘F‘,82,2);
14 insert into t_student values (7,‘G‘,98,1);
15 insert into t_student values (8,‘H‘,90,2);
16 insert into t_student values (9,‘I‘,90,2);
17
18 ---班级表
19 CREATE TABLE  t_class(
20   Id int,
21   Name nvarchar(100)
22 );
23
24 insert into t_class values (1,‘一班‘);
25 insert into t_class values (2,‘二班‘);
26  

一:首先我们先举个例子来认识一下over的庐山真面目

现在我们的需求是查询出来两个班级的前三名可以通过以下:

之前我的想法是根据分数排序然后取三条,后面发现如果分数一致的话,比如有3个人并列第一名,则这样的写法就完全不满足需求,所以我们可以通过over开窗函数来实现上面的要求

SELECT  * FROM ( SELECT Name ,Score ,ClassId ,RANK() OVER ( PARTITION BY classid ORDER BY score DESC ) ScoreRank FROM t_student) AS s
WHERE   s.ScoreRank < 4;

得到的结果如下:

注意:

1:sqlserver中的From (字表)的时候一定要As,否则报语法错误

2:RANK() 这个指的是为每一组的行生成一个序号,与ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如两个相同的行生成序号3,那么接下来会生成序号5。

3:Rank() Over(PARTITION BY classid ORDER BY score DESC )是指的先根据classid分组,然后再根据score分数倒叙排列,则是指的分组后生成Rank的序列化号

单单执行 SELECT Name ,Score ,ClassId ,RANK() OVER ( PARTITION BY classid ORDER BY score DESC ) ScoreRank FROM t_student会出现下面的结果:

二:Over的一些语法与用法

语法结构:OVER( [ PARTITION BY ... ] [ ORDER BY ... ] )

1 、partition by 字段名字A:子句进行分组,partition by是固定的分组语法;

2、order by 字段名字B:子句进行排序,order by 是固定的排序语法。

比如我们上面的例子就是用到了partition by classid 和 order by score这样的用法了,注意:如果联合使用指的意思是:先分组然后再排序

OVER()函数不能单独使用,必须跟在 排名函数( ROW_NUMBER、DENSE_RANK、RANK、NTILE) 或 5种聚合函数(SUM、MAX、MIN、AVG、COUNT)后边。

三:排名开窗函数

语法结构:排名函数() OVER ( [ <partition_by字段> ] <order_by字段> )

注意:在排名开窗函数中必须使用ORDER BY语句

下面分别介绍一下各个排名函数的用法和效果

1、ROW_NUMBER():为每一组的行记录按顺序生成一个唯一的行号。这个用的最多的是不连续的Id上下分页,重新生成id,也就是一行会生成一个连续的id值,如下:

注意:如果是分组,则每个组里面的id是连续的

2、RANK()也为每一组的行生成一个序号,与ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如两个相同的行生成序号3,那么接下来会生成序号5。

3、DENSE_RANK()和RANK()类似,不同的是如果有相同的序号,那么接下来的序号不会间断。也就是说如果两个相同的行生成序号3,那么接下来生成的序号还是4。

4、NTILE (integer_expression) 按照指定的数目将数据进行分组,并为每一组生成一个序号。

四:聚合开窗函数

语法结构:聚合函数( ) OVER ( [ partition by 字段] [order by 字段]) ,其中【partition by 字段】和【order by 字段】是可选择的

1:Max聚合函数

2:sum聚合函数

3:count聚合函数

下面的min和avg都是类似,暂时不举例了!

另外开窗函数和聚合函数的不同之处是:开窗函数对于每个组返回多行,而聚合函数对于每个组只返回一行

原文地址:https://www.cnblogs.com/loverwangshan/p/10384123.html

时间: 2024-11-05 22:58:12

sqlserver的over开窗函数(与排名函数或聚合函数一起使用)的相关文章

sql中的 开窗函数over() 聚合函数 排名函数

开窗函数与聚合函数一样,都是对行的集合组进行聚合计算.它用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列.反正我理解这个函数已经使用好子查询或者是其它方式求得聚合列的值给我合并. 以书中的例子一步一步来介绍,假设要计算所有人员的总数,我们可以执行下面的SQL语句: SELECT COUNT(FName) FROM T_Person 这种方式比较直接,只返回一个聚合列的值,没有任

SqlServer聚合函数

聚合函数对一组值计算后返回单个值.除了count(统计项数)函数以外,其他的聚合函数在计算式都会忽略空值(null).所有的聚合函数均为确定性函数.即任何时候使用一组相同的输入值调用聚合函数执行后的返回值都是相同的,无二义性.T-SQL提供的聚合函数一共有13个之多. 聚合函数通常会在下列场合使用: 1.select语句的选择列表,包括子查询和外部查询. 2.使用compute或compute by产生汇总列时. 3.having子句对分组的数据记录进行条件筛选. 聚合函数 1.平均值AVG A

SQLServer系统函数之聚合函数

聚合函数:指对一组值执行计算,并返回单个值.除了 Count(统计函数) 外,聚合函数都会忽略 Null 值 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用 1.Avg():返回数值列的平均值 示例如下: 1 --返回组中各值的平均值 2 select avg(column_name) from table_name  2.Count():返回组中找到的项数量,计数 示例如下: 1 --COUNT(*) 返回组中的项数. 包括 NULL 值和重复项 2 --COUNT(AL

sqlite之聚合函数的使用

聚合函数对一组值执行计算并返回单一的值.聚合函数对一组值执行计算,并返回单个值.除了 COUNT 以外,聚合函数都会忽略空值. 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用. count(*) --返回指定表的数量 例如:select count(*) from studen (where ....); sum(*)--返回数据之和(仅对数值类型字段起作用) 例如: 返回三科成绩总和: select sum(math)+sum(chinese)+sum(english)

SQL Server 聚合函数算法优化技巧

Sql server聚合函数在实际工作中应对各种需求使用的还是很广泛的,对于聚合函数的优化自然也就成为了一个重点,一个程序优化的好不好直接决定了这个程序的声明周期.Sql server聚合函数对一组值执行计算并返回单一的值.聚合函数对一组值执行计算,并返回单个值.除了 COUNT 以外,聚合函数都会忽略空值. 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用. v1.写在前面 如果有对Sql server聚合函数不熟或者忘记了的可以看我之前的一片博客.sql server 基

SSRS 2012 聚合函数 -- 介绍

SSRS 2012 聚合函数 -- 介绍 数据的运算除了单笔计算之外,同时还需要进行汇总计算,因此,SSRS中提供了一些列的聚合函数,凡是熟悉的加和.平均.计数.分组计数.最大值.最小值都有函数可以使用. 常用聚合函数 函数 说明 Avg 返回指定表达式的所有非Null平均值 Count 从指定表达式返回值的计数 CountDistinct 从指定表达式返回所有分组值的计数 CountRows 返回指定范围内的数据行计数 First 从指定表达式返回第一个值 Last 从指定表达式返回最后一个值

MongoDB学习总结(三) —— 常用聚合函数

上一篇介绍了MongoDB增删改查命令的基本用法,这一篇来学习一下MongoDB的一些基本聚合函数. 下面我们直奔主题,用简单的实例依次介绍一下. 1.count()函数 集合的count函数是最简单的聚合函数,返回集合中文档的数量. 2.distinct()函数 用于找出一个集合中,给定键的所有不同的值. 我们还可通过在数据库上运行命令,来执行distinct聚合函数,此时我们必须指定集合和键: 命令参数中,键"distinct"指定统计的集合名称,键"key"指

Hive聚合函数及采样函数详解

 本文主要使用实例对Hive内建的一些聚合函数.分析函数以及采样函数进行比较详细的讲解. 一.基本聚合函数 数据聚合是按照特定条件将数据整合并表达出来,以总结出更多的组信息.Hive包含内建的一些基本聚合函数,如MAX, MIN, AVG等等,同时也通过GROUPING SETS, ROLLUP, CUBE等函数支持更高级的聚合.Hive基本内建聚合函数通常与GROUP BY连用,默认情况下是对整个表进行操作.在使用GROUP BY时,除聚合函数外其他已选择列必须包含在GROUP BY子句中

SQL Server聚合函数

聚合函数对一组值计算后返回单个值.除了count(统计项数)函数以外,其他的聚合函数在计算式都会忽略空值(null).所有的聚合函数均为确定性函数.即任何时候使用一组相同的输入值调用聚合函数执行后的返回值都是相同的,无二义性.T-SQL提供的聚合函数一共有13个之多. 聚合函数通常会在下列场合使用: 1.select语句的选择列表,包括子查询和外部查询. 2.使用compute或compute by产生汇总列时. 3.having子句对分组的数据记录进行条件筛选. 聚合函数 1.平均值AVG A

sql 学习之 group by 及 聚合函数

1.在使用 GROUP BY 子句时,Select列表中的所有列必须是聚合列(SUM,MIN/MAX,AVG等)或是GROUP BY 子句中包括的列.同样,如果在SELECT 列表中使用聚合列,SELECT列表必须只包括聚合列,否则必须有一个GROUP BY 子句.例如: select customerid,salespersonid,count(*) from sales.salesorderheader where customerid <= 11010 group by customeri