2012-07-25 11 views
0

고급 SQL- 쿼리 (MSSQL 2000)에 대한 도움이 필요합니다.열이 고유 한 데이터베이스에서 값 가져 오기

나는 운동 경기 100 미터 경주 시간을 나열하는 Result이라는 테이블이 있습니다. 주자는 여러 경기 시간을 가질 수 있지만 각 주자에게 가장 좋은 시간을 보여주고 싶습니다.

결과 테이블에는 Result_id, athlete_id, result_time의 세 열이 있습니다. 따라서 은 값을 나열 할 때 고유해야하며 result_time은 가장 빠 른 (가장 낮은) 값이어야합니다.

아이디어가 있으십니까?

+0

하십시오

select athelete_id, min(result_time) as FastestTime from result group by athelete_id 

은 다음과 같이 다시에 가입하여 result 테이블에서 추가 열을 표시하려면 샘플 데이터와 원하는 출력을 제공하십시오. – RedFilter

답변

0

, 이렇게 :

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를 포함하고 result_time을 표시 할 수 있습니까? 나는 athlete_id를 순간에 울릴 수 있습니다. – Inzajt

+0

@Inzajt 질문에 따르면, 'result_date' 열은 없습니다. * "Result-table에는 Result_id, athlete_id, result_time의 세 열이 있습니다."* – RedFilter

+0

죄송합니다. 가능한 한 쉽게 도와 주셨습니다. – Inzajt

0

원하는 것은 집계 함수를 사용하는 것입니다. 이 경우 min()은 다른 선택된 열의 동일한 데이터를 가진 모든 행에서 미니 민 데이터를 선택합니다. 이것은 우리가 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 절에 추가의 select 절에 그들을 데리고 당신은 추가해야합니다 집계 함수의 일부가 아닌 group by에있는 모든 열. 집계 함수는 min(), max(), avg()과 같은 것입니다.

짧은 대답 : 대괄호 안에 열을 넣지 않으려면 그룹 옆에 있어야합니다.

+0

이것은 result_id를 제거 할 때 작동하지만 result_time을 반향시킬 수 없습니다. 어떻게 "group_by"에 포함시킬 수 있습니까? 그것은 이미 MIN() 함수에서 "select"에 존재합니다. "group by"을 추가하면 나는 엉망이 될 수 있습니까? – Inzajt

+0

내가 쓴 것을 잊어 버리고, 나는 테이블을 정렬하는 것을 잊어 버렸고, 이것 역시 작동하지 않는다. 모든 결과 표시 – Inzajt

+0

집계 함수의 이름을 지정할 수 있습니다. 나는 내 대답을 수정하려고합니다. – Fluffeh

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()를 사용합니다. 당신은 단순히 각 athlete_id 가장 빠른 시간을 필요로하는 경우

+0

* windows 함수 *는 무엇을 의미합니까? 왜 집계 함수를 원할 때 같은 테이블에 조인을합니까? – Fluffeh

+0

Windows 함수는 "over"staetment를 사용하는 함수의 한 이름입니다 (일반적으로 "partition by"및/또는 "order by"가 뒤에옵니다). SQL Server 2005 이상에서는 다른 집계 함수 외에도 row_number(), rank(), dense_rank() 및 ntile()을 특수 함수로 지원합니다. –

+0

Windows 기능에 대한 설명 건배 :) 아직 한 열의 최소값 만 원한다면 왜 자체적으로 조인합니까?SQLServer를 많이 사용하지는 않았지만 쿼리가 단순한 집계가 될 수 있습니까? (나는 너와 같이 협박하는 사람들에게 의문을 제기하는 것을 싫어한다. 그러나 55K가있는 균열이라도 단순한 집합체가 작동한다고 생각하는 것 같다.) – Fluffeh

관련 문제