我可以找到我的一个sql语句的解决方案,我想请求你的帮助;)
让我们想象一下,我们有运动员的表,他们必须跑100米远的距离。 每次运行后,每次运行都会运行Run,Name和Time:
Run Name Time[s]
1 Joe 10
2 Joe 11
1 Jim 14
2 Jim 12
我想要做的是选择Run,Name和最快的时间,所以在这种情况下它将是min(Time)。 但是当我使用Min聚合函数时,我必须按所有其他参数进行分组,因此它将返回所有记录...
我试过这个。但它不起作用:
SELECT MIN(Time) AS MinTime, Name AS TimeName
From Athletes
group by TimeName
LEFT JOIN
(Select Run, Name, Time From Athletes a)
On
a.Name = TimeName, a.Time = MinTime;
是的,它有语法错误,但它不是主要问题,因为我不知道它仍然无法正常工作。
提前谢谢, SQL新手答案 0 :(得分:4)
您的SQL查询到处都是您有一个不必要的联接,而您的group by
位置错误,left join
语法也不正确。我废弃它并重新编写它以正确使用min()
。
SELECT run, MIN(Time) AS MinTime,
Name AS Timename
From Athletes
group by TimeName
无需在同一个表上运行join
,如果您知道group by
需要哪些列,则也不需要where子句。
在sqlfiddle上测试并使用。 http://sqlfiddle.com/#!2/13b1a/2
我建议你仔细阅读group by
做了什么以及如何正确地join
表。
随着表的增长,如果您没有使用任何类型的id或密钥,您可以使用实际涉及子查询的更高级查询:
select a.run,
a1.name,
a1.Time
from athletes as a
,(select name,
min(time) as Time
from athletes
group by name) as a1
where a.time = a1.Time
and a.name = a1.name
仍然没有理由使用join
,子查询路由是您当前数据集和架构的合适路径。 http://sqlfiddle.com/#!2/23cb4/23
答案 1 :(得分:0)
select Run , Name, Time from Athletes a
where Time=(select min(time)
from Athletes s
where s.Name=a.Name)
答案 2 :(得分:0)
SELECT *
FROM Athletes a
WHERE a.Time = (select min(time) from Athletes a2 where a2.Name = a.Name)
以下是SqlFiddle
上的示例用法答案 3 :(得分:0)
尝试此查询:
SELECT r.Run, r.Name, r.Time
FROM (SELECT * FROM Athletes ORDER BY Time) r
GROUP BY r.Name
答案 4 :(得分:-1)
我看到left-join
是您提问的标签之一,但没有它就可以完成。
SELECT *
FROM Athletes a
WHERE a.Time = ( SELECT MIN(a2.Time) FROM Athletes a2 )
请注意,如果有两个或更多的参赛者并列最快时间,您可能会从查询中获得多个结果。希望这会有所帮助。
以下是获取相同信息的查询,按运动员名称分组:
SELECT a.*
FROM #Athletes a
JOIN ( SELECT a2.Name, MIN(a2.Time) Time FROM #Athletes a2 GROUP BY a2.Name) BestTimes
ON a.Name = BestTimes.Name
AND a.Time = BestTimes.Time