Sql 查找一个字段的值,该值与另一个字段中数据的最大值匹配

Sql 查找一个字段的值,该值与另一个字段中数据的最大值匹配,sql,sql-server,sql-server-2005,aggregate,Sql,Sql Server,Sql Server 2005,Aggregate,我正在尝试编写一个查询,以获取与另一个字段(或多个字段)的最大值关联的一个字段的值。假设我有以下数据表: 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 1

我正在尝试编写一个查询,以获取与另一个字段(或多个字段)的最大值关联的一个字段的值。假设我有以下数据表:

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
。如果有多条记录共享最大订单日期,则从具有最大日期的记录中获取与最大订单ID相关联的
LocationID

最后一组数据应如下所示:

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

我一直在尝试编写一个包含大量嵌套子查询和丑陋连接的查询,但我没有真正取得任何进展。我需要编写什么样的SQL来帮助我获得这个结果。

诀窍是将子查询用作值,而不是联接:

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;
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
       )
如果您将从Customers表中提取任何列,这可能会比其他方法的性能更好

如果不是,那么仅从订单中提取的
行号
答案可能是最好的。但如果您以任何方式受到客户的限制,则交叉应用将再次成为最佳选择。可能是大幅度的

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