【问题标题】:SQL Query sorting rows by duplicate name keeping lowest in resultSQL Query 按重复名称对行进行排序,结果保持最低
【发布时间】:2015-01-15 22:23:09
【问题描述】:

我有一个包含 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 ;

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

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

【问题讨论】:

  • 您只是按您的非聚合列之一进行分组,MySQL 将允许您出于某些吸烟的原因这样做。将所有非聚合列包含在 group by 中,然后重试。
  • 真的有必要每次都说明db吗?它总是相同的分贝?!!?!

标签: mysql dbvisualizer


【解决方案1】:

使用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;

【讨论】:

    【解决方案2】:

    你掉进了nonstandard MySQL extension to GROUP BY的陷阱。

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

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

    Result
    Temp
    FullName
    Province
    BirthDate
    Position
    Location
    Date   
    Event
    Gender
    Agegroup
    

    因此,第一步是为每位游泳者确定每项赛事的最佳时间。为此,我们需要做出几个假设。

    1. 一个人由 FullName、BirthDate 和 Gender 唯一标识。
    2. 事件由事件、性别、年龄组唯一标识。

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

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

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

    现在的挑战是找出每个人最佳时间的情况。这些情况包括 Temp、Provincial、Position、Location、Date。我们将通过原始表和我们的虚拟表之间的 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'
    

    【讨论】:

      猜你喜欢
      • 2018-07-25
      • 1970-01-01
      • 2020-10-11
      • 2011-09-28
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多