1

您对这个问题的亲切帮助将非常感谢编程菜鸟。我试图搜索谷歌世界过去 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 排名技术,因为它极大地减少了查询时间与子查询

非常感谢您的专业知识!!

4

1 回答 1

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;

仅供参考,静态语句意味着变量将保持其值,并且不会在每次调用函数时重置。

于 2013-05-04T00:24:12.643 回答