MS Access 2010 排名查询比较两列的唯一排名
Posted
技术标签:
【中文标题】MS Access 2010 排名查询比较两列的唯一排名【英文标题】:MS Access 2010 Ranking Query comparing two columns for unique ranks 【发布时间】:2013-05-03 23:05:11 【问题描述】:您对这个问题的慷慨帮助将非常感谢您编程菜鸟。 过去 3 天我尝试搜索谷歌世界,但没有成功。
背景: 我正在构建保修数据库的综合分析,我必须比较两列值以在产品组中优先考虑,以便我们的团队需要调查。 这些都是; 1. 首先按失败次数 2. 当故障数量与保修成本相关时,其次是保修成本
采取的步骤: 我使用了子查询技术来获得我想要的东西。但是使用这条路线查询完成太慢了。 (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 排名技术,因为它极大地减少了查询时间与子查询
非常感谢您的专业知识!
【问题讨论】:
【参考方案1】:如果您尝试严格使用 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;
仅供参考,Static 语句意味着变量将保持其值,并且不会在每次调用函数时重置。
【讨论】:
非常感谢!我会试试你的编码。请允许我问更多。 (我简化了我的场景,假设我可以学习逻辑,但现在有疑问)你能告诉我如何处理下面的例子吗?我正在分享我当前数据库的屏幕截图。 (我还试图以 1 个月为增量增加排名字段,这将比较相应的故障/成本。为了使生活更艰难,可以有其他额外的 partgroup 字段。link 这变得更加复杂了。如果愿意,请在单独的问题中提出。还需要有关您正在尝试做的事情的更多详细信息。 汤姆,感谢您的及时评论。我想我可以使用您将排名号分配到排序列表(组和故障/成本的降序)的巧妙功能来构建每个月的排名查询,并将查询合并为一个。让我尝试并根据需要发布单独的问题。再次感谢 Tom,我已经尝试过您的解决方案,并遇到了 ["Undefined function 'RankMe' in expression] 表字段名称与我的示例完全相同。有什么建议吗?非常感谢您的专业知识跨度> 函数必须放在模块中。在 Access 中按 Alt-F11 打开代码窗口。右键单击模块(左侧)并选择新建模块。然后将函数粘贴到其中。以上是关于MS Access 2010 排名查询比较两列的唯一排名的主要内容,如果未能解决你的问题,请参考以下文章