2017-08-29 4 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であると推測します。あなたは 'CustomerOrderguid'ではなく' partition by'でcustomerid列を持っていますか? – 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; 
関連する問題