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

时间:2016-04-06 00:54:12

标签: sql ms-access

有这个表:

tomcat::setenv::entry

我如何选择所有行但删除重复的行,让运动员参加同一赛事(菲尔兹运动员和赛事),并选择最低(或该运动员的最高分),我也想将每个赛事限制为前10名运动员(未在结果中显示)

预期输出(选择最高标记),(第5行被删除)

setenv.sh

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

SELECT [tblPerformanceData-FieldBoys] .Eventnum,[tblPerformanceData- FieldBoys] .Mark,[tblPerformanceData-FieldBoys] .Meet,[tblPerformanceData-FieldBoys] .CY,[tblPerformanceData-FieldBoys] .AleleteID,[tblPerformanceData-FieldBoys]。 MeetID

FROM [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;

2 个答案:

答案 0 :(得分:0)

您可以使用级联查询来执行此操作。尝试在主表上运行分组查询,该查询仅包括运动员,事件和标记。 max或min子句将根据您要查找的结果应用于标记。使用此查询作为第二个查询的源,您可以使用运动员,事件和标记字段之间的直接链接将其链接回初始表。 what the second query should look like

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

答案 1 :(得分:0)

我不拥有或无权访问MS Access,但我可以为您提供SQL,并希望Access支持一些基本语法。

选项1:如果Row是您的主键,则更容易,但您不需要在结果中返回它;在这种情况下,您甚至可以使用简单的查询为同一行中的同一运动员同时获得MINMAX的{​​{1}}和Mark

SELECT
  Athlete, Event, Meet, MAX(Mark) AS HighestMark, MIN(Mark) AS LowestMark
FROM
  MyTable
GROUP BY
  Athlete, Event, Meet

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

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

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)

很少注意到:

  • 上面的查询返回MAX(Mark);将其更改为MIN(Mark)以返回最低值
  • 此查询也可以使用JOIN重写;我不确定Access更喜欢哪种方法(即运行得更快)
  • 它有2个子查询;顶部子查询MAX(Row)用于确保如果相同的运动员在相同的比赛和事件中获得相同的马克,则仅选择1行;在这种情况下,返回的Row越大
  • 可以使用一个查询(作为单独的行)返回MINMAX,但代价是额外的子查询,但您没有要求