• 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() 一起用于分页。
    
  • 相关阅读:
    NOIP前做题记录
    AtCoder Grand Contest 021题解
    AtCoder Grand Contest 020 题解
    CODE FESTIVAL 2017 Final题解
    Code Chef October Challenge 2019题解
    5.20 校内模拟
    5.19 湖南师大附中省选模拟1
    NOI2016 循环之美
    博弈复习
    5.18 省选模拟
  • 原文地址:https://www.cnblogs.com/4littleProgrammer/p/4744809.html
Copyright © 2020-2023  润新知