分组的SQL子查询问题,平均值
时间:2020-03-06 14:55:44 来源:igfitidea点击:
在MS Transact SQL中,假设我有一个像这样的表(订单):
Order Date Order Total Customer # 09/30/2008 8.00 1 09/15/2008 6.00 1 09/01/2008 9.50 1 09/01/2008 1.45 2 09/16/2008 4.50 2 09/17/2008 8.75 3 09/18/2008 2.50 3
我需要的是:对于每个客户,最近两个订单的平均订单金额。因此,对于客户1,我应该得到7.00(而不是7.83)。
我已经盯着这个呆了一个小时(在一个更大的问题中,我已经解决了),我想我的大脑已经冻结了。帮助一个简单的问题?
解决方案
这应该使它
select avg(total), customer from orders o1 where orderdate in ( select top 2 date from orders o2 where o2.customer = o1.customer order by date desc ) group by customer
在SQL Server 2005中,我们具有用于分区的RANK函数:
USE AdventureWorks; GO SELECT i.ProductID, p.Name, i.LocationID, i.Quantity ,RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS 'RANK' FROM Production.ProductInventory i INNER JOIN Production.Product p ON i.ProductID = p.ProductID ORDER BY p.Name; GO
关联
一种选择是让我们使用游标遍历所有客户ID,然后将平均值作为几个子查询进行。
但是,对于大型数据集,一般警告是查询效率不是很高,并且可能需要很长时间才能处理。