【问题标题】:MS Access 2010 Ranking Query comparing two columns for unique ranksMS Access 2010 排名查询比较两列的唯一排名
【发布时间】: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 排名技术,因为它极大地减少了查询时间与子查询

非常感谢您的专业知识!

【问题讨论】:

    标签: ms-access ms-access-2010


    【解决方案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 打开代码窗口。右键单击模块(左侧)并选择新建模块。然后将函数粘贴到其中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多