查询返回

时间:2015-03-07 10:30:53

标签: sql sql-server

我需要编写一个可以返回符合以下结果的查询。对于三个表,客户,产品和订单历史记录,我想找到每个客户的每个产品的最新订单。任何帮助表示赞赏。

1 个答案:

答案 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年 支持