2012-07-25 44 views
0

我需要高级SQL查询(MSSQL 2000)的帮助。从列中唯一的数据库获取值

我有一张名为Result的表,其中列出了竞技100米比赛时间。一个跑步者可以有几个比赛时间,但我只想显示每个跑步者的最佳时间。

结果表包含三列Result_id,athlete_id,result_time。因此,athlete_id在列出值时必须是唯一的,并且result_time必须是最快(最低)的值。

任何想法?

+0

请提供样本数据和期望的输出。 – RedFilter 2012-07-25 14:33:25

回答

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 
+0

这个工作正常,但我如何包含result_date和show result_time?我目前只能回显athlete_id – Inzajt 2012-07-25 14:09:29

+0

@Inzajt根据你的问题,没有'result_date'列。 *“结果表包含三栏,Result_id,athlete_id,result_time”* – RedFilter 2012-07-25 14:32:16

+0

对不起,我想让你尽可能容易地帮助我。 – Inzajt 2012-07-25 14:44:05

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()等。

简答:如果你没有在括号中加一列,它可能必须在组中。

+0

这工作时,我删除result_id,但我不能回显result_time,我怎么能包括在“group_by”?它已经存在于MIN()函数中的“select”中,如果我在“group by”中添加,我是不是会搞砸了? – Inzajt 2012-07-25 14:04:50

+0

忘记我写的东西,我忘记排序表,无法让这个工作。显示所有结果 – Inzajt 2012-07-25 14:08:14

+0

您可以命名聚合函数。我正在修改我的答案以显示。 – Fluffeh 2012-07-25 14:08:30

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()。

+0

* windows功能*是什么意思?当你只想要一个聚合函数时,为什么要加入同一个表? – Fluffeh 2012-07-25 13:13:01

+0

Windows函数是使用“over”的函数的一个名称(通常后面跟着“partition by”和/或“order by”)。除了其他聚合函数之外,SQL Server 2005及更高版本还支持row_number(),rank(),dense_rank()和ntile()作为特殊函数。 – 2012-07-25 13:17:21

+0

欢呼的Windows功能的解释:)尽管如此,如果他只想要一列的最小值,为什么自己加入?我根本没有使用过多的SQLServer,但肯定查询可能是一个简单的聚合呢? (我讨厌用rep的人来质疑民众和你的一样恐吓,但即使是55K的人似乎也认为一个简单的聚合会起作用) – Fluffeh 2012-07-25 13:20:26