0

我有一个包含 11 列的田径表,我创建了一个 SQL 查询,该查询按特定事件、年龄组和性别对表进行排序,取出所有重复项并保留结果最好的那个。对于某些事件,它还区分有风读数的结果和没有风读数的结果,以及风是否超过一定速度。

 @export on;
@export set filename="/home/filename.csv" CsvColumnDelimiter=",";
select * from Results2015;

SELECT resu.Result,
       resu.Wind,
       resu.`Full Name`,
       resu.Province,
       resu.BirthDate,
       resu.Position,
       resu.Location,
       resu.Date
  FROM Results2015 resu
  JOIN (
               SELECT MIN(Result) BestResult,
                      Wind, `Full Name`, Gender,
                      Event, Agegroup
                 FROM Results2015
                GROUP BY `Full Name`, Gender, Event, Agegroup
       ) best   
           ON  resu.Result    = best.BestResult
          AND  resu.Wind      = best.Wind 
          AND  resu.`Full Name`  = best.`Full Name`
          AND  resu.Gender    = best.Gender
          AND  resu.Event     = best.Event
          AND  resu.Agegroup  = best.Agegroup
  WHERE resu.Event = '100m'
   AND resu.Gender = 'F'
   AND resu.Agegroup = 'Junior' 
   AND resu.Wind <> ''
   AND resu.Wind <= 2                    
 ORDER BY resu.Result asc;

它工作得很好,但我注意到它丢失了很多结果,包括风读数,我不知道为什么。这是我使用的表格示例

Result  Wind    Full Name   Province    BirthDate   Position    Location    Date    Event   Gender  Agegroup
12.78   -3.6    Name 4      WPA         D.o.B       6           Bellville   3-Feb   100m    F       Junior
12.87   -3.6    Name 2      WPA         D.o.B       7           Bellville   8-Feb   100m    M       Youth
12.64   -0.8    Name 3      WPA         D.o.B       2           Bellville   8-Feb   100m    F       Junior
12.02   -0.8    Name 4      WPA         D.o.B       1           Bellville   8-Feb   100m    F       Junior
12.84   -0.8    Name 5      WPA         D.o.B       3           Bellville   8-Feb   100m    F       Junior
13.07   -0.8    Name 6      WPA         D.o.B       4           Bellville   8-Feb   100m    F       Junior
13.23   -0.8    Name 7      WPA         D.o.B       5           Bellville   8-Feb   100m    F       Junior
13.71   -4.3    Name 8      WPA         D.o.B       1           Bellville   8-Feb   100m    F       Junior
13.85   -4.3    Name 9      WPA         D.o.B       2           Bellville   8-Feb   100m    F       Junior
14.33   -4.3    Name 10     WPA         D.o.B       3           Bellville   8-Feb   100m    F       Junior
14.69           Name 11     WPA         D.o.B       4           Bellville   2-Feb   100m    F       Junior
13.11   -2.9    Name 12     WPA         D.o.B       1           Bellville   8-Feb   100m    F       Sub-Youth
13.43   -2.9    Name 13     WPA         D.o.B       2           Bellville   8-Feb   100m    F       Sub-Youth
13.53   -2.9    Name 12     WPA         D.o.B       3           Bellville   14-Feb  100m    F       Sub-Youth
13.60   -1.5    Name 15     WPA         D.o.B       1           Bellville   14-Feb  100m    F       Sub-Youth

由于某种原因,它完全跳过了输出中的名称 4。Name 4 的数据与其他条目完全相同,它会显示这些,但它完全排除了 Name 4 以及其他条目,但据我所知,只有那些有风读物的条目。

如果我将 Wind 添加到 GROUP BY 部分

GROUP BY `Full Name`, Gender, Event, Agegroup, Wind

它确实显示了所有正确的结果,但是我想避免很多重复。

知道发生了什么吗?

我对所有 SQL 查询都使用 DbVisualizer Pro

SQLFiddle 示例在这里http://www.sqlfiddle.com/#!2/f8958/1 问题在于 Tamza Bay 没有显示在输出中

4

1 回答 1

0

这是因为名称 4 在 AgeGroup 'Youth' 中,而不是您的查询指定的 'Junior' 中。

在添加适当的数据并使用 fiddler 播放后进行编辑:

这是您的查询:

(Edit2 - 查询已删除空间/)

不同之处在于您对内部查询的 GROUP BY 。您没有将 Wind 指定为其中的一部分。大多数 DBMS 都会出错,但 MySQL 不会。它还对格式错误的 GROUP BY 的查询做了一些奇怪的事情 - 即使用不包括选择中所有未聚合列的组的查询。在这种情况下,它导致 GROUP BY 返回 2.4 风速,然后被排除在外。这是 MySQL 的一个已知“功能”。

编辑 2:我更改了 te fiddle 以包含此查询:

       SELECT MIN(`Result`) `BestResult`,
              `Full Name`, `Gender`,
              `Event`, `Agegroup`
         FROM `Results2015`
        GROUP BY `Full Name` , `Gender`, `Event`, `Agegroup`;

...这是您的内部查询,用于从完整表中选择正确的结果。这为 Tamza Bay 提供了 11.64 的最佳结果,这确实是最好的结果。但是,那场比赛的风是 2.4,所以外面的 Where 不包括它。这就是为什么。

可能您需要在内部查询中包含外部 where:

               SELECT MIN(`Result`) `BestResult`,
                      `Full Name`, `Gender`,
                      `Event`, `Agegroup`
                 FROM `Results2015`
  WHERE `Event` = '100m'
   AND `Gender` = 'F'
   AND `Agegroup` = 'Junior' 
       AND `Wind` <> ''
   AND `Wind` <= 2    
                GROUP BY `Full Name` , `Gender`, `Event`, `Agegroup`

基本上,确保内部查询为人们返回您想要的结果,然后将其插入主查询。

于 2015-02-18T17:39:40.223 回答