2011-01-22 120 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将再次成为最佳选择。可能会有很大的利润。

相关问题