2008-09-30 112 views
3

在MS的Transact SQL,让我们说我有一个表(订单)是这样的: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)。

我一直盯着这里一个小时(在一个更大的问题,我已经解决了),我认为我的大脑已经冻结。帮助解决一个简单的问题?

+0

哪个版本的SQL Server? – Sklivvz 2008-09-30 15:38:16

+0

客户可以在一天中有多个订单吗? – 2008-09-30 15:45:46

回答

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 
+0

如果某个特定日期的订单超过一个,则可能无法正常工作,例如如果对于一个客户你有一天3个订单。子查询会为您提供2条相同日期的记录,而顶部查询将考虑到所有3条订单 - 但也许这不是上下文中的真实生活场景。 – kristof 2008-09-30 16:01:15

0

在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 

Link

0

一个选项将是你使用游标循环遍历所有客户Id,然后将平均值作为几个子查询。

公平的警告,虽然对于大型数据集,查询效率不高,可能需要很长时间才能处理。