对于编程菜鸟,非常感谢您对这个问题的慷慨帮助。 我试图搜索谷歌世界最近3天没有运气。
背景 我正在构建一个保修数据库的综合分析,我必须比较两列值,以便在产品组中确定优先级,以便我们的团队需要调查。 这些是; 1.首先是失败数 2.当失败数量相关时,其次是保修成本
采取的步骤: 我使用了Subquery技术来获得我想要的东西。但是使用这条路线对查询来说是如此之慢。 (11,000行,字面上冻结我的comp至少5分钟)。 因此我用谷歌搜索并发现这个用户在跟随线程会话时遇到与我相同的挑战,幸运的是使用INNER JOIN技术解决,而不是由其他专家解答。耶!
请参阅www.pcreview.co.uk/forums/ranking-performance-slow-t2844316.html
好吧,除了.....我的查询与他非常相似,但我还想在失败被绑定时比较第二列,从而获得同一组中所有人的独特排名。 (以上用户只比较一列,而不关心关系,不像我申请他/她)
期望输出:
表1。
Part Failures Cost Desired-Rank
A 10 $5 1
A 5 $3 3
A 5 $20 2
B 5 $10 2
B 5 $5 3
B 9 $2 1
到目前为止我的查询
SELECT Count(*) AS Rank, dupe.Part, dupe.Failures, dupe.Cost
FROM [Table1] AS dupe
INNER JOIN [Table1] AS dupe1
ON dupe.Part = dupe1.Part and
dupe.Failures <= dupe1.Failures and dupe.Cost<=dupe1.Cost
Group By dupe.Part, dupe.Failures, dupe.Cost;
我最近几天试图调整and dupe.Cost<=dupe1.Cost
部分而不是真正了解编程的基础知识。 (我主要通过复制其他代码来学习,并在看到输出后尝试理解它)
请注意,我认为我必须坚持这种JOIN排名技术,因为它极大地减少了查询时间与子查询
非常感谢您的专业知识!
答案 0 :(得分:0)
如果您尝试使用SQL严格执行此操作,那么您的查询可能会变得庞大,因为它需要大量的子查询。更好的方法是使用函数。这仅适用于您在Access中使用查询,而不是您刚刚连接到它时。
首先,功能(放入模块):
Function RankMe(Part As String) As Long
Static LastPart As String
Static RankNum As Long
If Part <> LastPart Then
RankNum = 1
LastPart = Part
Else
RankNum = RankNum + 1
End If
RankMe = RankNum
End Function
你会像这样使用它:
SELECT Table1.Part, Table1.Failures, Table1.Cost, RankMe([Part]) AS Rank, Table1.[Desired-Rank], *
FROM Table1
ORDER BY Table1.Part, Table1.Failures DESC , Table1.Cost DESC;
仅供参考,静态语句意味着变量将保持其值,并且不会在每次调用函数时重置。