Sql 根据两个字段中的某些字段选择行并删除重复项,并限制为前十名?

Sql 根据两个字段中的某些字段选择行并删除重复项,并限制为前十名?,sql,ms-access,Sql,Ms Access,拥有这张桌子: Row Athlete Event Mark Meet 1 1 3 10 A 2 2 2 5 A 3 3 3 3 A 4 4 4 7

拥有这张桌子:

    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行)

感谢您的帮助我想要的查询(减去前十名)是:

选择[TBLPPerformanceData FieldBoys].Eventnum[TBLPPerformanceData-FieldBoys].Mark[TBLPPerformanceData FieldBoys].Meet[TBLPPerformanceData FieldBoys].CY[TBLPPerformanceData FieldBoys].AthleteID[TBLPPerformanceData FieldBoys].MeetID

从[TBLPPerformanceData FieldBoys]内部加入([TBLPPerformanceData FieldBoys].AthleteID=MaxAthleteByEventBoysField.AthleteID)和([TBLPPerformanceData FieldBoys].Mark=MaxAthleteByEventBoysField.MaxOfMark)和([TBLPPerformanceData FieldBoys].Eventnum=MaxAthleteByEventBoysField.Eventnum)

按[TBLPPerformanceData FieldBoys].Eventnum[TBLPPerformanceData FieldBoys].Mark[TBLPPerformanceData FieldBoys].Meet[TBLPPerformanceData FieldBoys].CY[TBLPPerformanceData FieldBoys].AthleteID[TBLPPerformanceData FieldBoys].MeetID分组


由[TBLPPerformanceData FieldBoys]订购。Mark DESC

您可以使用级联查询来完成。尝试在仅包含运动员、事件和标记的主表上运行group by查询。max或min子句将根据您要查找的结果应用于标记。使用此查询作为第二个查询的源,在该查询中使用运动员、事件和标记字段之间的直接链接链接回初始表


这就解决了第一部分。我不知道如何使用查询获得每个事件的前十名。

我没有MS access,也没有访问权限,但我可以给您提供SQL,希望access支持一些基本语法

选项1:如果
是您的主键,但不需要在结果中返回它,则更容易;在这种情况下,您甚至可以通过一个简单的查询获得同一行中同一运动员的
标记的
MIN
MAX

SELECT Athlete, Event, Meet, MAX(Mark) AS HighestMark, MIN(Mark) AS LowestMark FROM MyTable GROUP BY Athlete, Event, Meet 几点注意:

  • 以上查询返回
    MAX(Mark)
    ;将其更改为
    MIN(标记)
    以返回最低值
  • 这个查询也可以用
    JOIN
    s重写;我不确定Access更喜欢哪种方法(即运行更快)
  • 它有2个子查询;顶部子查询
    MAX(Row)
    用于确保如果同一比赛和项目中的同一运动员获得相同的分数,则仅选择1行;在这种情况下,返回较大的
  • 可以通过一个查询(作为单独的行)返回
    MIN
    MAX
    ,但不需要额外的子查询

谢谢..当我将查询限制为三个字段时,第一个查询工作正常…但是,无法使其与链接表和查询一起工作。您创建了第二个查询,就像我所附的图片一样?第二个查询的目的是合并query1中缺少的列。我完全按照附件构建了它。很抱歉,我帮不上什么忙。它在我的机器上运行(使用上面显示的数据集)感谢iveyb123…在再次尝试您的方法后,它运行了..查询发布在底部的问题中,最终成功。 SELECT Athlete, Event, Meet, MAX(Mark) AS HighestMark, MIN(Mark) AS LowestMark FROM MyTable GROUP BY Athlete, Event, Meet SELECT Row, Athlete, Event, Mark, Meet FROM MyTable m0 WHERE m0.Row IN (SELECT MAX(Row) FROM MyTable m1 WHERE Athlete = m0.Athlete AND Event = m0.Event AND Meet = m0.Meet Mark = (SELECT MAX(Mark) FROM MyTable WHERE Athlete = m1.Athlete AND Event = m1.Event AND Meet = m1.Meet) GROUP BY Athlete, Event, Meet, Mark)