SQL 查询按重复名称对行进行排序,在结果中保持最低

SQL Query sorting rows by duplicate name keeping lowest in result

我有一个包含 11 列的 table,我想创建一个查询来删除全名列中具有重复名称的行,但保留结果列中具有最小值的行。目前我有这个。

SELECT
    MIN(sql363686.Results2014.Result),
    sql363686.Results2014.Temp,
    sql363686.Results2014.Full Name,
    sql363686.Results2014.Province,
    sql363686.Results2014.BirthDate,
    sql363686.Results2014.Position,
    sql363686.Results2014.Location,
    sql363686.Results2014.Date   
FROM
    sql363686.Results2014
WHERE
    sql363686.Results2014.Event = '50m Freestyle'
AND sql363686.Results2014.Gender = 'M'
AND sql363686.Results2014.Agegroup = 'Junior'
GROUP BY
    sql363686.Results2014.Full Name
ORDER BY
    sql363686.Results2014.Result ASC ;

乍一看它似乎工作正常并且我得到了所有正确的值,但我在位置列中得到的值似乎与我在数据库 table 中的值不同(错误)。所有其他值似乎都是正确的。关于我做错了什么的想法?

我目前正在使用连接到 mysql 数据库的 dbVisualizer。此外,我对 sql 的知识和经验是最低限度的

使用group by和一个join:

select r.*
from sql363686.Results2014 r
     (select fullname, min(result) as minresult
      from sql363686.Results2014 r
      group by fullname
     ) rr
     on rr.fullname = r.fullname and rr.minresult = r.minresult;

你掉进了nonstandard MySQL extension to GROUP BY的圈套。

(我不会使用所有那些完全限定的列名;这是不必要的和冗长的。)

我认为您正在寻找每个游泳运动员在特定事件中的最佳时间,并且您正试图从所谓的非规范化 table 中提取它。看起来你的 table 有这些列。

Result
Temp
FullName
Province
BirthDate
Position
Location
Date   
Event
Gender
Agegroup

因此,第一步是为每个游泳运动员确定每个项目的最佳时间。为此,我们需要做出一些假设。

  1. 一个人由全名、出生日期和性别唯一标识。
  2. 事件由事件、性别、年龄组唯一标识。

此子查询将获取每个项目中每个游泳者的最佳时间。

SELECT MIN(Result) BestResult,
       FullName,BirthDate, Gender,
       Event, Agegroup
  FROM Results2014
 GROUP BY FullName,BirthDate, Gender, Event, Agegroup

这将为您提供一个虚拟的 table 每个人在每个事件中的最快成绩(使用 personevent前面提到过)。

现在的挑战是去找出每个人最佳时间的情况。这些情况包括 Temp、Province、Position、Location、Date。我们将在原始 table 和我们的虚拟 table 之间使用 JOIN 来做到这一点,就像这样

SELECT resu.Event,
       resu.Gender,
       resu.Agegroup,
       resu.Result,
       resu.Temp.
       resu.FullName,
       resu.Province,
       resu.BirthDate,
       resu.Position,
       resu.Location,
       resu.Date
  FROM Results2014 resu
  JOIN (
               SELECT MIN(Result) BestResult,
                      FullName,BirthDate, Gender,
                      Event, Agegroup
                 FROM Results2014
                GROUP BY FullName,BirthDate, Gender, Event, Agegroup
       ) best   
           ON  resu.Result    = best.BestResult
          AND  resu.FullName  = best.FullName
          AND  resu.BirthDate = best.BirthDate
          AND  resu.Gender    = best.Gender
          AND  resu.Event     = best.Event
          AND  resu.Agegroup  = best.Agegroup
 ORDER BY resu.Agegroup, resu.Gender, resu.Event, resu.FullName, resu.BirthDate

你知道这是怎么回事吗?您需要一个提取最佳时间的聚合查询。然后,您需要在 ON 子句中使用该聚合查询中的列值,从详细信息 table 中获取最佳时间的详细信息。

如果您只想报告一个事件,您可以在 ORDER BY 之前添加一个适当的 WHERE 子句,如下所示。

 WHERE resu.Event = '50m Freestyle'
   AND resu.Gender = 'M'
   AND resu.Agegroup = 'Junior'