我需要有关高级SQL查询(MSSQL 2000)的帮助。
我有一张名为Result
的桌子,列出了田径100米的比赛时间。跑步者可以有几个比赛时间,但我想只显示每个跑步者的最佳时间。
结果表包含三列,Result_id
,athlete_id
,result_time
。因此,athlete_id
在列出值时必须是唯一的,result_time
必须是最快(最低)的值。
有什么想法吗?
答案 0 :(得分:1)
在SQL Server 2000中,您无法使用Windows功能。您可以按如下方式执行此操作:
select r.*
from result r join
(select athlete_id, min(result_time) as mintime
from result r
group by athlete_id
) rsum
on rsum.athlete_id = r.athlete_id and r.time = rsum.mintime
在更新版本的SQL Server中,您将使用row_number()。
答案 1 :(得分:0)
您想要的是使用聚合函数。在这种情况下min()
将从其他所选列中具有相同数据的所有行中选择minumin数据。这意味着您还必须使用group by子句。下面的查询可以为您提供所需的结果。
编辑:如果您需要其他列,只需将它们放入select
子句中,然后将它们添加到group by
子句中,如下所示:
select althlete_id, result_id, min(result_time) as result_time from result-table group by althlete_id, result_id
select althlete_id, result_id, min(result_time) as result_time, race_date from result-table group by althlete_id, race_date, result_id
编辑:您需要将所有列添加到group by
中,而不是聚合函数的一部分。聚合函数包括min()
,max()
,avg()
等。
简短回答:如果您没有在括号中添加列,则可能必须在组中。
答案 2 :(得分:0)
如果您只需要每个athlete_id
的最快时间,请执行以下操作:
select athelete_id, min(result_time) as FastestTime
from result
group by athelete_id
要显示result
表中的其他列,您可以像这样加入:
select r.*
from result r
inner join (
select athelete_id, min(result_time) as FastestTime
from result
group by athelete_id
) rm on r.athelete_id = rm.athelete_id and r.result_time = rm.FastestTime