基于两个字段的某些字段选择行并删除重复项并限制为前十名?
Posted
技术标签:
【中文标题】基于两个字段的某些字段选择行并删除重复项并限制为前十名?【英文标题】:Selecting Rows and removing duplicates based on some fields based on two fields and limit to Top Ten? 【发布时间】:2016-04-06 00:54:11 【问题描述】:有这张桌子:
Row Athlete Event Mark Meet
1 1 3 10 A
2 2 2 5 A
3 3 3 3 A
4 4 4 7 A
5 2 2 4 A
6 3 2 5 B
7 1 1 10 C
如何选择所有行但删除重复的行,让运动员参加同一赛事(田径运动员和赛事),并选择该运动员的最低(或最高分数),我还想将每个事件限制为前 10 名运动员(未显示在结果中)
预期输出(选择最高分),(删除第 5 行)
Row Athlete Event Mark Meet
1 1 3 10 A
2 2 2 5 A
3 3 3 3 A
4 4 4 7 A
6 3 2 5 B
7 1 1 10 C
感谢您的帮助,我想要的查询(减去前十名)是:
选择 [tblPerformanceData-FieldBoys].Eventnum、[tblPerformanceData-FieldBoys].Mark、[tblPerformanceData-FieldBoys].Meet、[tblPerformanceData-FieldBoys].CY、[tblPerformanceData-FieldBoys].AthleteID、[tblPerformanceData-FieldBoys]。会议ID
从 [tblPerformanceData-FieldBoys] INNER JOIN MaxAthleteByEventBoysField ON ([tblPerformanceData-FieldBoys].AthleteID = MaxAthleteByEventBoysField.AthleteID) AND ([tblPerformanceData-FieldBoys].Mark = MaxAthleteByEventBoysField.MaxOfMark) AND ([tblPerformanceData-FieldBoys].Eventnum = MaxAthleteByEventBoysField.Eventnum)
GROUP BY [tblPerformanceData-FieldBoys].Eventnum, [tblPerformanceData-FieldBoys].Mark, [tblPerformanceData-FieldBoys].Meet, [tblPerformanceData-FieldBoys].CY, [tblPerformanceData-FieldBoys].AthleteID, [tblPerformanceData-FieldBoys] .MeetID
ORDER BY [tblPerformanceData-FieldBoys].Mark DESC;
【问题讨论】:
【参考方案1】:您可以使用级联查询来做到这一点。尝试在只包括运动员、事件和标记的主表上运行分组查询。根据您要查找的结果,max 或 min 子句将应用于标记。将此查询用作第二个查询的源,您可以在其中使用运动员、事件和标记字段之间的直接链接链接回初始表。 what the second query should look like
这解决了第一部分。我不确定如何使用查询获得每个事件的前十名。
【讨论】:
谢谢..当我将查询限制为三个字段时,第一个查询工作得很好......但是,无法让它与您的链接表和查询一起工作。 您像我附上的图片那样构建了第二个查询?第二个查询的目的是合并 query1 中缺失的列。 我完全按照附件构建它。 很抱歉,我不能提供更多帮助。它在我的机器上运行(使用上面显示的数据集) 谢谢 iveyb123...在再次尝试您的方法后它工作了..查询发布在底部的问题中,终于工作了。【参考方案2】:我没有MS Access,也没有访问权限,但我可以给你SQL,希望Access能支持一些基本的语法。
选项1:如果Row
是您的主键,但您不需要在结果中返回它会更容易;在这种情况下,您甚至可以使用简单的查询同时获得同一行中同一运动员的Mark
中的MIN
和MAX
:
注意:我假设您也想按 Meet
分组,但如果不是这样,您可以将其从 GROUP BY
中删除,但其值在结果中将失去意义。
选项 2:Row
是主键,但您确实需要返回它 - 显然在这种情况下 min 和 max 不能在同一行中返回,并且查询看起来完全不同:
几点说明:
以上查询返回MAX(Mark)
;将其更改为 MIN(Mark)
以返回最低值
这个查询也可以用JOIN
s 重写;我不确定 Access 更喜欢哪种方法(即运行速度更快)
它有2个子查询;顶部子查询MAX(Row)
是为了确保如果同一场比赛和赛事中的同一运动员获得相同的标记,则只选择 1 行;在这种情况下,会返回更大的Row
可以通过一个查询(作为单独的行)同时返回 MIN
和 MAX
,但需要额外的子查询,但您没有要求
【讨论】:
以上是关于基于两个字段的某些字段选择行并删除重复项并限制为前十名?的主要内容,如果未能解决你的问题,请参考以下文章