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



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

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 ;

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

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

使用 group byjoin

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;

你已经落入了非标准MySQL扩展到GROUP BY的陷阱。

(我不打算使用所有这些完全限定的列名;这是不必要且冗长的。

我认为你正在寻找每个游泳运动员在特定项目中的最佳成绩,你试图从所谓的非规范化表格中提取出来。 看起来您的表有这些列。

Result
Temp
FullName
Province
BirthDate
Position
Location
Date   
Event
Gender
Agegroup

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

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

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

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

这将为您提供一个虚拟表,其中包含每个人在每个事件中的最快结果(使用前面提到的人员和事件的定义)。

现在的挑战是找出每个人最好时间的情况。这些情况包括临时、省份、职位、位置、日期。我们将在原始表和虚拟表之间使用 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 子句中使用该聚合查询中的列值,以便从详细信息表中获取最佳时间的详细信息。

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

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

最新更新