在MS Transact SQL中,假设我有一个像这样的表(Orders):
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)。
我一直在盯着这一个小时(在一个更大的问题中,我已经解决了),我认为我的大脑已经冻结了。帮助解决一个简单的问题?
答案 0 :(得分:5)
这应该是它
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
答案 1 :(得分:0)
在SQL Server 2005中,您具有RANK函数,与partition:
一起使用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
答案 2 :(得分:0)
一种选择是使用游标循环遍历所有客户ID,然后将平均值作为多个子查询。
虽然公平警告,对于大型数据集,查询效率不高,可能需要很长时间才能处理。