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
因此,第一步是为每个游泳运动员确定每个项目的最佳时间。为此,我们需要做出一些假设。
- 一个人由全名、出生日期和性别唯一标识。
- 事件由事件、性别、年龄组唯一标识。
此子查询将获取每个项目中每个游泳者的最佳时间。
SELECT MIN(Result) BestResult,
FullName,BirthDate, Gender,
Event, Agegroup
FROM Results2014
GROUP BY FullName,BirthDate, Gender, Event, Agegroup
这将为您提供一个虚拟的 table 每个人在每个事件中的最快成绩(使用 person 和 event前面提到过)。
现在的挑战是去找出每个人最佳时间的情况。这些情况包括 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'
我有一个包含 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
因此,第一步是为每个游泳运动员确定每个项目的最佳时间。为此,我们需要做出一些假设。
- 一个人由全名、出生日期和性别唯一标识。
- 事件由事件、性别、年龄组唯一标识。
此子查询将获取每个项目中每个游泳者的最佳时间。
SELECT MIN(Result) BestResult,
FullName,BirthDate, Gender,
Event, Agegroup
FROM Results2014
GROUP BY FullName,BirthDate, Gender, Event, Agegroup
这将为您提供一个虚拟的 table 每个人在每个事件中的最快成绩(使用 person 和 event前面提到过)。
现在的挑战是去找出每个人最佳时间的情况。这些情况包括 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'