获取SQL Server中每个客户的最新/最高订单ID

时间:2015-05-31 13:09:03

标签: sql sql-server

我有一个数据库,用于记录客户的所有订单。我想要做的不是获得每个客户的所有订单,而是客户与我们订购的最新订单。我已经通过使用Sub-Select语句来做到这一点,但由于有多少数据,它需要很多时间来检索。所以我想知道是否还有另外一种方法可以加快速度呢?

以下是我编写的Sub-Select语句的代码:

SELECT  Customer.CustomerId,
        Customer.Firstname + ' ' + Customer.Surname AS [Customer Name],
        (SELECT TOP(1) Orders.OrderId
        FROM Orders
        WHERE Orders.CustomerId = Customer.CustomerId
        ORDER BY Orders.OrderId DESC),
        (SELECT TOP(1) Orders.Item
        FROM Orders
        WHERE Orders.CustomerId = Customer.CustomerId
        ORDER BY Orders.OrderId DESC)
FROM Customer

非常感谢任何帮助或有关如何改进此信息的信息。

由于

4 个答案:

答案 0 :(得分:0)

试试这个:

SELECT T1.CustomerID,T1.OrderID,T2.OrderItem
FROM
   (SELECT C.CustomerID,MAX(O.OrderID) as OrderID
    FROM Customer C JOIN 
      Orders O ON C.CustomerID=O.CustomerID
    GROUP BY C.CustomerID) T1 
    JOIN
   (SELECT OrderID,Item
    FROM Orders) T2 ON T1.OrderID=T2.OrderID

SQL Fiddle中的示例结果。

答案 1 :(得分:0)

  1. 如果创建了索引,则重建/刷新索引,这将有助于提高查询的性能。

  2. 尝试创建非群集索引,这将加快查询的执行速度。

答案 2 :(得分:0)

可能对你有帮助

WITH cte AS (
    SELECT c.CustomerName, 
           c.OrderID, 
           ROW_NUMBER() OVER(PARTITION BY c.CustomerName 
                                 ORDER BY c.CustomerName  DESC) AS rk
      FROM Customers c
      join Orders j c.OrderID = j.OrderId
      )
SELECT a.*
  FROM cte a
 WHERE a.rk = 1

答案 3 :(得分:0)

有时候使用row_number会得到更好的结果,所以你可以尝试这样的事情:

select * from (
  SELECT
    C.CustomerId,
    C.Firstname + ' ' + C.Surname AS [Customer Name],
    O.OrderId,
    O.Item,
    row_number() over (partition by O.CustomerId order by O.OrderId desc) as RN
  FROM
    Customer C
    join Orders O on O.CustomerId = O.CustomerId
) X
where RN = 1

如果有很多订单和客户,这也可能很慢,因为没有搜索条件。您还应该检查索引,尤其是Orders.CustomerId。

没试过,所以希望没有语法错误:)