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

本文介绍了如何通过SQL查询解决实际项目中的常见问题,即求取不同产品类别下价格最高的产品信息。通过两种方法实现:一是进行一次连接操作,二是利用OVER()函数直接筛选结果集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

实现过程如下:

 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() 一起用于分页。

 

转载于:https://www.cnblogs.com/4littleProgrammer/p/4744809.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值