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

 

posted @ 2015-08-20 12:32  我是攻城狮  阅读(1561)  评论(0编辑  收藏  举报