sql server利用开窗函数over() 进行分组统计

这是一道常见的面试题,在实际项目中经常会用到。

需求:求出以产品类别为分组,各个分组里价格最高的产品信息。

实现过程如下:

 declare @t table(
 ProductID   int,
 ProductName varchar(20),
 ProductType varchar(20),
 Price int)

 --测试数据
 insert @t
 select 1,‘name1‘,‘P1‘,3 union all
 select 2,‘name2‘,‘P1‘,5 union all
 select 3,‘name3‘,‘P2‘,4 union all
 select 4,‘name4‘,‘P2‘,4

 --做法一:找到每个组里,价格最大的值;然后再找出每个组里价格等于这个值的
 --缺点:要进行一次join
 select t1.*
   from @t t1
   join (select ProductType,
			    max(Price) Price
			    from @t
			    group by ProductType) t2 on t1.ProductType = t2.ProductType
  where t1.Price = t2.Price
  order by ProductType

 --做法二:利用over(),将统计信息计算出来,然后直接筛选结果集。
 --over() 可以让函数(包括聚合函数)与行一起输出。
 ;with cte as(
	 select *, max(Price) over(partition by (ProductType)) MaxPrice
	   from @t)
 select ProductID,ProductName,ProductType,Price from cte where Price = MaxPrice
  order by ProductType

 --over() 的语法为:over([patition by ] <order by >)。需要注意的是,over() 前面是一个函数,如果是聚合函数,那么order by 不能一起使用。
 --over() 的另一常用情景是与 row_number() 一起用于分页。
时间: 2024-08-30 00:03:30

sql server利用开窗函数over() 进行分组统计的相关文章

SQL SERVER:开窗函数 SUM() OVER() 数据统计中一例使用

由于前一段时间胃痛,导致博客园博客都停更了一个月左右.近几天,胃病终于稍微有所好转,决定重新写博文. 前几天,有个朋友刚好问到本人有关 SQL 语句,大致是原表有两列,分别为月份.月份销售额,而需要一条 SQL 语句实现统计出每个月份以及当前月以前月份销售额和.尼玛,感觉还是没有说清,下面用图表示.      SQL 测试表脚本        DECLARE @Temp Table ( ID INT, --- 月份 MoneyData Float --- 金额 ) insert INTO @TE

SQL Server 2012 - 开窗函数

-- 开窗函数:在结果集的基础上进一步处理(聚合操作) -- Over函数,添加一个字段显示最大年龄 SELECT * , MAX(StuAge) OVER ( ) MaxStuAge FROM dbo.Student; -- Over函数,添加一个字段显示总人数 SELECT * , COUNT(StuID) OVER ( ) StuCount FROM dbo.Student; -- Partition By 分组统计数量 -- 根据性别分组后,统计 SELECT COUNT(*) OVER

【SQL Server 2012】按倒序存储“分组统计”结果的临时表到新建表

程序预先说明: 本文访问的数据库是基于存有RDF三元组的开源数据库Localyago修改的库,其中只有一个表,表中有五个属性:主语subject.谓语predict.宾语object.主语的编号subid,宾语的编号objid.每条记录由(subject,predict,object,subid,objid)组成.其中当宾语为字符型而不是实体时(比如"2011"),编号默认为0.有以下数据表: 程序需求: 统计每个主语有多少相关的谓语属性(每个谓语可有多个宾语),即有多少以该实体作为主

SQL Server 基础 04 函数与分组查询数据

函数与分组查询数据 系统函数分 聚合函数.数据类型转换函数.日期函数.数学函数 . . . 1. 聚合函数 主要是对一组值进行计算,然后返回一个值. 聚合函数包括 sum(求和).avg(求平均值).min().max().count(求数量) sum函数语法  :  sum(列明) select sum(sno) as 序号和 from stu_info avg select avg(sno) as 序号平均值 from stu_info . . . count 用来一组值的个数,统计 sel

SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)

原文:SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页) SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅途(www.Zuowenjun.cn) --CreateDate:2015-06-02 --Function:分页获取数据 /******************/ crea

SQL Server数据库ROW_NUMBER()函数使用

下面以几个实例来说明ROW_NUMBER()函数的使用. 实例如下: 1.使用row_number()函数进行编号,如 select email,customerID, ROW_NUMBER() over(order by psd) as rows from QT_Customer 原理:先按psd进行排序,排序完后,给每条数据进行编号. 2.在订单中按价格的升序进行排序,并给每条记录进行排序代码如下: select DID,customerID,totalPrice,ROW_NUMBER() 

SQL Server数据库ROW_NUMBER()函数使用详解

SQL Server数据库ROW_NUMBER()函数使用详解 摘自:http://database.51cto.com/art/201108/283399.htm SQL Server数据库ROW_NUMBER()函数的使用是本文我们要介绍的内容,接下来我们就通过几个实例来一一介绍ROW_NUMBER()函数的使用. 实例如下: 1.使用row_number()函数进行编号,如 select email,customerID, ROW_NUMBER() over(order by psd) a

SQL Server UDF用户自定义函数

UDF的定义 和存储过程很相似,用户自定义函数也是一组有序的T-SQL语句,UDF被预先优化和编译并且尅作为一个单元爱进行调用.UDF和存储过程的主要区别在于返回结果的方式. 使用UDF时可传入参数,但不可传出参数.输出参数的概念被更为健壮的返回值取代了.和系统函数一样,可以返回标量值,这个值的好处是它并不像在存储过程中那样只限于整形数据类型,而是可以返回大多数SQL Server数据类型. UDF有以下两种类型: 返回标量值的UDF. 返回表的UDF. 创建语法: CREATE FUNCTIO

SQL Server 2008 分区函数和分区表详解

SQL Server 2008 分区函数和分区表详解 2012-10-28 20:06 来源:博客园 作者:zhijianliutang 字号:T|T [摘要]本文详细介绍SQL Server 2008 分区函数和分区表,包括查询某个分区.归档数据.添加分区.删除分区等内容. 当我们数据量比较大的时候,我们需要将大型表拆分为多个较小的表,则只访问部门数据的查询就可以更快的运行,基本原理就是,因为要扫描的数据变的更小.维护任务(例如,重新生成索引或备份表)也可以更快的运行. 我们可以再不通过将表物