找到与另一个字段中的数据的最大值匹配的一个字段的值

时间:2011-01-22 17:50:35

标签: 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    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,然后LocationID与最大OrderDate相关联。如果有多个记录共享最大订单日期,请从具有最大日期的记录中获取与最大LocationID相关联的OrderID

最终的数据集应如下所示:

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

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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

如果你从Customers表中提取任何列,这可能胜过其他方法

如果没有,那么仅从Orders拉出的Row_Number答案可能是最好的。但是,如果您以任何方式限制客户,那么CROSS APPLY将再次成为最佳。可能是一个很大的差距。

答案 2 :(得分: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
       )