基于两个字段的某些字段选择行并删除重复项并限制为前十名?

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 中的MINMAX

选择 Athlete, Event, Meet, MAX(Mark) AS HighestMark, MIN(Mark) AS LowestMark 从 我的表 通过...分组 运动员, 事件, 满足

注意:我假设您也想按 Meet 分组,但如果不是这样,您可以将其从 GROUP BY 中删除,但其值在结果中将失去意义。

选项 2:Row 是主键,但您确实需要返回它 - 显然在这种情况下 min 和 max 不能在同一行中返回,并且查询看起来完全不同:

选择 行,运动员,事件,标记,满足 从 我的表 m0 WHERE m0.Row IN (选择最大(行) 从我的表 m1 在哪里 运动员 = m0. 运动员 AND 事件 = m0.事件与 满足 = m0.Meet 标记 = (SELECT MAX(标记) 从我的表 在哪里 运动员 = m1.Athlete AND 事件 = m1.事件与 满足 = m1.Meet) 通过...分组 运动员、事件、见面、标记)

几点说明:

以上查询返回MAX(Mark);将其更改为 MIN(Mark) 以返回最低值 这个查询也可以用JOINs 重写;我不确定 Access 更喜欢哪种方法(即运行速度更快) 它有2个子查询;顶部子查询MAX(Row) 是为了确保如果同一场比赛和赛事中的同一运动员获得相同的标记,则只选择 1 行;在这种情况下,会返回更大的Row 可以通过一个查询(作为单独的行)同时返回 MINMAX,但需要额外的子查询,但您没有要求

【讨论】:

以上是关于基于两个字段的某些字段选择行并删除重复项并限制为前十名?的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER 2005删除重复数据

Swift:无法在基于条件的字符限制的文本字段中删除字符

如何选择具有最新日期的行并根据该行计算另一个字段

arcgis删除两个完全重叠字段

如何使用 sql group by 选择前 2 项并对一个字段求​​和?

选择语句以查找某些字段的重复项