2008-09-30 147 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,然後將平均值作爲幾個子查詢。

公平的警告,雖然對於大型數據集,查詢效率不高,可能需要很長時間才能處理。