带分组的SQL子查询问题,平均值

时间:2008-09-30 15:35:34

标签: sql sql-server-2005

在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)。

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

3 个答案:

答案 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

Link

答案 2 :(得分:0)

一种选择是使用游标循环遍历所有客户ID,然后将平均值作为多个子查询。

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