2012-07-25 40 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