2011-03-29 65 views
0

我有每個類別的計算產品級別的查詢:Access查詢:尋找最高級別的產品在每個類別

qryEvalProd  
category Product Rank 
-------- ------- ---- 
Cat1  Prod6  1254 
Cat1  Prod1  950 
Cat1  Prod2  800 
Cat2  Prod3  1500 
Cat2  Prod5  950 

我想做出一個查詢,以最好的產品回報爲每個類別:

category Product 
-------- ------- 
Cat1  Prod6  
Cat2  Prod3  

我知道我可以使用包含group by和max的相關子查詢來做到這一點,但是由於性能原因,我試圖使用Group By和First來使它成爲一個鏡頭。但我無法表達我希望按照DESC Rank排序的每隻貓的第一支產品。

有沒有一種方法可以一次完成?

回答

1

這個調整讓你添加你想要的訂單。它使用子查詢......但不是相關子查詢,所以性能不會受到影響:

SELECT Category, First(Product) AS BestProduct 
FROM (
    SELECT Category, Product, Rank 
    FROM qryEvalProd 
    ORDER BY Category, Rank DESC 
) AS Ordered 
GROUP BY Category; 
+0

嘿,那看起來很有趣,明天第一次測試(我現在在歐洲,現在是晚上)...我會讓你更新的。 – 2011-03-31 18:37:07

+0

輝煌。我將它分爲兩​​個不同的查詢來維護(我的問題對於SO來說非常簡單),但這非常快速和高效。謝謝。 – 2011-04-01 07:47:27

0

也許使用HAVING clause可能有幫助?

+0

也許......但如何?這是一個問題:-) – 2011-03-29 12:25:02

0

其實這似乎工作。我只是有點懊惱,因爲我不能在我的發言輸入數據集的順序強制,但無論如何,它wors ..

SELECT Category, First(Product) AS BestProduct 
FROM qryEvalProd  
GROUP BY Category; 

我可以添加ORDER BY Category不會對輸出有任何影響。我本來希望加上ORDER BY Category, Rank,但這不被接受。

如果有人有更好的建議,你仍然歡迎。

0

你可能有這樣的事情開始:

SELECT Category, Product 
FROM qryEvalProd 
WHERE Product = 
    (SELECT TOP 1 Self.Product 
    FROM qryEvalProd AS Self 
    WHERE Self.Category = qryEvalProd.Category 
    ORDER BY Self.Rank DESC) 

如果有關係(即兩個產品與同級別的同一類別),這個查詢將任意選擇其中之一的可能性。

如果你希望它總是選擇同一個,你可以通過改變ORDER BY子句來做它想做的事。如果你想它,而不是到列表

ORDER BY Self.Rank DESC, Self.Product 

:例如,如果在平局的情況下,你希望它挑一個按字母順序的第一個產品的價值,你可能BY子句順序更改爲所有具有最高排名的產品,你可以使用這樣的查詢:

SELECT Category, Product 
FROM qryEvalProd 
WHERE Rank = 
    (SELECT Max(Self.Rank) 
    FROM qryEvalProd AS Self 
    WHERE Self.Category = qryEvalProd.Category) 
+0

布賴恩,謝謝你的詳細答案。起初我想不經過嘗試就拒絕它,因爲我的問題特別提到我想避免相關的子查詢。無論如何,我決定嘗試一下,然後驚喜地發現,查詢的速度幾乎是我的解決方案的兩倍。但是......一旦你開始向下滾動,每次按下PgDn就需要幾分鐘時間。不可用。我的解決方案需要6分鐘才能執行,然後每頁不會有額外的延遲。我必須說這些數據量相對較高:65000個訪問行過濾掉了360000個數據,加上100000個Oracle數據行。 – 2011-03-29 15:07:28

+0

@iDevelop,抱歉,我沒有看到「無相關子查詢」條件。沒有相關子查詢的方法是: 1。編寫一個查詢,查找每個類別的最大排名,如:'SELECT Category,Max(Rank)AS Rank from qryEvalProd' 2.在類別和排名上加入您的原始查詢。 這將在平局時爲每個類別返回多條記錄。如果這不是你想要的,請發回。 我不認爲你可以「一槍」。 – 2011-03-29 16:33:32

+0

@iDevelop,由「你原來的」我的意思是qryEvalProd。 – 2011-03-29 16:39:49

相關問題