2017-08-29 22 views
0

我有以下查詢來提取客戶的最近購買。出於性能方面的原因,我嘗試使用子查詢,但是我遇到了一堵牆,不斷收回所有客戶的訂單。我只需要每個客戶的最新消息。SQL Server:使此排名高效

SELECT * 
FROM (SELECT od.*, ord.OrderName, ord.OrderDate, RowN = 
Row_Number() 
OVER (PARTITION BY ord.CustomerOrderGUID ORDER BY ord.OrderDate DESC) 
FROM #OrderData od 
JOIN CV3Orders ord ON ord.CustomerOrderGUID = od.CustomerOrderGUID 
WHERE ord.ProductName = 'Product 10') rnk 
WHERE rnk.RowN = 1 
+0

您能告訴我們您的樣品數據和預期結果嗎? –

+0

我打算猜測'CustomerOrderguid'與customerId不同,而是OrderId。你有一個customerid列來「分區」而不是「CustomerOrderguid」嗎? – SqlZim

+0

我的數據由訂購特定產品的客戶組成。客戶多次購買相同的產品,因此我試圖找到最有效的方式來隔離最近的購買並顯示最近的購買(以及來自該行的其他信息)。例如,如果我有一位過去購買3袋咖啡的顧客。我想要顯示最近購買的咖啡。我提交的查詢完美無缺,但運行需要很長時間。我看到,如果我可以用一個子查詢來做同樣的事情來縮短執行時間。 – DPool34

回答

0

CustomerOrderGuid似乎代表每爲了不是每個客戶。所以,你需要按正確的列進行分區。我可能會猜到:

SELECT co.* 
FROM (SELECT od.*, ord.OrderName, ord.OrderDate, 
      Row_Number() OVER (PARTITION BY ord.CustomerGUID ORDER BY ord.OrderDate DESC) as seqnum 
     FROM #OrderData od JOIN 
      CV3Orders ord 
      ON ord.CustomerOrderGUID = od.CustomerOrderGUID 
     WHERE ord.ProductName = 'Product 10' 
    ) co 
WHERE seqnum = 1;