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&lt;=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 排名查询比较两列的唯一排名的主要内容,如果未能解决你的问题,请参考以下文章

基于一个查询生成多个类似的报告 - MS Access

MS Access - TEXT 字段的排名

MS Access 2010 多列组合框自动完成

使用表单过滤交叉表查询 MS Access 2010

使用 c# 和 oledb 查询更新 Ms-Access 2010 中的列值

MS access 2010 SQL查询帮助