SQL Query 显示带风的结果,但它跳过某些行

Posted

技术标签:

【中文标题】SQL Query 显示带风的结果,但它跳过某些行【英文标题】:SQL Query display results with wind but it skips certain lines 【发布时间】:2015-02-18 11:20:16 【问题描述】:

我有一个包含 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 没有显示在输出中

【问题讨论】:

mysql 和 SQL Server 有同样的问题? 请使用列标题更新您的示例数据。目前我们不能说哪一列是风或哪一列是什么。也尝试制作一个SQLFiddle.com 样本,这对大家有很大帮助 您的 Wind 列是 varchar 还是数字,不清楚,因为您的 WHERE calsue 指定了 resu.Wind '' AND resu.Wind 从子查询中删除 Wind 列,我认为它应该可以工作。 @BerndLinde 好的酷我用相关信息更新了我的帖子。我也在这里做了一个 SQLFiddle 示例sqlfiddle.com/#!2/688584/3 【参考方案1】:

这是因为姓名 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`

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

【讨论】:

没关系,名称 4 在示例表的第 4 行附近也有一个作为女性初级的结果。在此处查看 SQLFiddle 示例 sqlfiddle.com/#!2/688584/3 我猜你说的是 Jank van Wank ?如果是这样,她将出现在您链接到的提琴手中。 (如果您链接到问题中的提琴手,并指定问题所在的名称会有所帮助。) 谢谢我编辑了我的问题。问题在于 Tamza Bay 没有出现在输出中,即使她既是少年又是女性。 一旦我将 Wind 添加到 GROUP BY 查询中,我就会开始为同一个人获取多个列表,我想避免 sqlfiddle.com/#!2/eb6db/1 好的。将 Wind 完全从内部查询中移除,并将其从 ON 列表中删除。

以上是关于SQL Query 显示带风的结果,但它跳过某些行的主要内容,如果未能解决你的问题,请参考以下文章

带偏移的 Linux 头/尾

在 Windows 7 上的 Eclipse 中调试 Genymotion

为啥 C 预处理器不忽略它跳过的块中的无效指令?

如何跳过打印 SQL 脚本但仍显示 DBMS 值?

pytest 已知用例会执行失败,想要指定它跳过执行,并标记为xfail (不同于skip)

NSIS - 使用命令行参数跳过某些对话框?