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 显示带风的结果,但它跳过某些行的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 7 上的 Eclipse 中调试 Genymotion