2011-01-22 81 views
3

我正在嘗試編寫一個查詢,以獲取與另一個字段(或多個字段)的最大值最大值關聯的一個字段的值。 。比方說,我下面的數據表有:找到與另一個字段中數據的最大值匹配的一個字段的值

OrderID CustomerID OrderDate LocationID   
1  4   1/1/2001 1001 
2  4   1/2/2001 1003 
3  4   1/3/2001 1001 
4  5   1/4/2001 1001 
5  5   1/5/2001 1001 
6  5   1/6/2001 1003 
7  5   1/7/2001 1002 
8  5   1/8/2001 1003 
9  5   1/8/2001 1002 

分組由CustomerID,我想最大的OrderDate,然後用什麼是最大OrderDate相關的LocationID。如果有多個記錄共享最大訂單日期,則從具有最大日期的那些記錄中選取與最大值OrderID關聯的LocationID

最後一組數據應該是這樣的:

CustomerID OrderDate LocationID  
4   1/3/2001 1001 
5   1/8/2001 1002 

我一直在試圖寫有很多嵌套子查詢的查詢和醜陋的加入,但我真的不成氣候。我需要寫什麼SQL來幫助我獲得這個結果。

回答

5
with cte As 
(
select *, 
     row_number() over (partition by CustomerID 
          order by OrderDate desc, OrderId desc) as rn 
from yourtable 
) 
select CustomerID, OrderDate,LocationID 
from cte 
where rn=1; 
0

訣竅是使用子查詢作爲值,而不是一個聯接:

select customerId,orderDate,locationId 
    from orders o1 
where orderDate = (
      select top 1 orderdate 
      from orders o2 
      where o1.customerId = o2.customerId 
      order by orderdate desc 
     ) 
3
SELECT 
    C.Name, 
    C.CustomerID, 
    X.* 
FROM 
    Customers C 
    CROSS APPLY (
     SELECT TOP 1 OrderDate, LocationID 
     FROM Orders O 
     WHERE C.CustomerID = O.CustomerID 
     ORDER BY OrderDate Desc, OrderID Desc 
    ) X 

如果你將其拉離客戶表中的任何列,這將可能跑贏其他方法

如果不是,那麼Row_Number答案只能從訂單中提取,可能是最好的。但是,如果您以任何方式限制客戶,那麼CROSS APPLY將再次成爲最佳選擇。可能會有很大的利潤。

相關問題