我试图编写一个查询,该查询获取一个字段的值,该字段与另一个字段(或多个字段)的最大值相关联。假设我有以下数据表:
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相关联的OrderID。
最后一组数据应该如下所示:
CustomerID OrderDate LocationID
4 1/3/2001 1001
5 1/8/2001 1002我一直试图编写一个包含大量嵌套子查询和丑陋联接的查询,但我并没有真正做到这一点。我需要写什么SQL来帮助我获得这个结果。
发布于 2011-01-22 17:53:06
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;发布于 2011-01-22 18:09:30
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表中提取任何列,这可能会使的性能优于其他方法。
如果没有,那么Row_Number的回答,只从订单中提取,可能是最好的。但是,如果您以任何方式限制客户,那么CROSS APPLY将再次是最好的。可能有很大的差距。
发布于 2011-01-22 17:54:32
诀窍是将子查询用作值,而不是连接:
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
)https://stackoverflow.com/questions/4769491
复制相似问题