Access查询:寻找*别的产品在每个类别

问题描述:

我有每个类别的计算产品级别的查询: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排序的每只猫的第一支产品。

有没有一种方法可以一次完成?

这个调整让你添加你想要的订单。它使用子查询......但不是相关子查询,所以性能不会受到影响:

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

也许使用HAVING clause可能有帮助?

+0

也许......但如何?这是一个问题:-) – 2011-03-29 12:25:02

其实这似乎工作。我只是有点懊恼,因为我不能在我的发言输入数据集的顺序强制,但无论如何,它wors ..

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

我可以添加ORDER BY Category不会对输出有任何影响。我本来希望加上ORDER BY Category, Rank,但这不被接受。

如果有人有更好的建议,你仍然欢迎。

你可能有这样的事情开始:

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