我需要编写一个可以返回符合以下结果的查询。对于三个表,客户,产品和订单历史记录,我想找到每个客户的每个产品的最新订单。任何帮助表示赞赏。
答案 0 :(得分:1)
每个客户的每个产品的最新订单 - 您可以使用ROW_NUMBER()
窗口功能并按每个标准对分区数据来实现此目的
所以尝试这样的事情(只是猜测表名和列名,因为你没有提供任何东西继续):
;WITH NewestData AS
(
SELECT
oh.OrderDate,
c.CustomerName,
p.ProductName,
RowNum = ROW_NUMBER() OVER (PARTITION BY oh.CustomerID, oh.ProductID
ORDER BY oh.OrderDate DESC)
FROM
dbo.OrderHistory oh
INNER JOIN
dbo.Customer c ON oh.CustomerID = c.CustomerID
INNER JOIN
dbo.Product p ON oh.ProductID = p.ProductID
)
SELECT
OrderDate, CustomerName, ProductName
FROM
NewestData
WHERE
RowNum = 1
好的,解释时间:
CTE(公用表表达式)基本上连接了三个表(猜测表名和列名是什么,以及它们是如何连接的)并从这些表中选择一些列(可以添加更多列,如果你需要它们,当然!)
对于每个“分区”数据,RowNum
是一个连续的数字,从1开始; PARTITION BY
子句表示对于(CustomerID, ProductID)
的每个组合,您希望根据{ORDER BY
得到一个“分区”编号(1,2,3,4,.....) {1}}子句 - 在这里,它获得1
的数字,用于该分区的最新订单(对于该客户+产品)。
所以最后,您需要做的就是从CTE中选择,并选择那些只有RowNum = 1
的行 - 这些是每个“分区的最新订单“您的订单历史记录表中的(CustomerID, ProductID)
。
这适用于SQL Server 2005 及更新版本 - 2000年 支持