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;
其实这似乎工作。我只是有点懊恼,因为我不能在我的发言输入数据集的顺序强制,但无论如何,它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)
布赖恩,谢谢你的详细答案。起初我想不经过尝试就拒绝它,因为我的问题特别提到我想避免相关的子查询。无论如何,我决定尝试一下,然后惊喜地发现,查询的速度几乎是我的解决方案的两倍。但是......一旦你开始向下滚动,每次按下PgDn就需要几分钟时间。不可用。我的解决方案需要6分钟才能执行,然后每页不会有额外的延迟。我必须说这些数据量相对较高:65000个访问行过滤掉了360000个数据,加上100000个Oracle数据行。 – 2011-03-29 15:07:28
@iDevelop,抱歉,我没有看到“无相关子查询”条件。没有相关子查询的方法是: 1。编写一个查询,查找每个类别的最大排名,如:'SELECT Category,Max(Rank)AS Rank from qryEvalProd' 2.在类别和排名上加入您的原始查询。 这将在平局时为每个类别返回多条记录。如果这不是你想要的,请发回。 我不认为你可以“一枪”。 – 2011-03-29 16:33:32
@iDevelop,由“你原来的”我的意思是qryEvalProd。 – 2011-03-29 16:39:49
嘿,那看起来很有趣,明天第一次测试(我现在在欧洲,现在是晚上)...我会让你更新的。 – 2011-03-31 18:37:07
辉煌。我将它分为两个不同的查询来维护(我的问题对于SO来说非常简单),但这非常快速和高效。谢谢。 – 2011-04-01 07:47:27