2012-03-16 2 views
0

내 데이터베이스 테이블은 다음과 같이이다 :고유 적용을 TOP (1) 함께

 
#tblMain 
ID  Value CreatedDate 
________________________________________ 
1  25  2011-10-11 14:00:45.910 
1  20  2011-10-26 14:00:12.910 
2  27  2011-10-14 14:00:32.910 
2  39  2011-10-14 14:00:28.910 
2  54  2011-10-17 14:00:27.910 
3  67  2011-10-25 14:00:16.910 
3  79  2011-10-25 14:00:02.910 
4  34  2011-10-26 14:00:14.910 
4  24  2011-10-26 14:00:06.910 
4  88  2011-10-26 14:00:47.910 
5  12  2011-10-26 14:03:14.910 
5  34  2011-10-26 14:04:06.910 
5  55  2011-10-26 14:04:47.910 

내가 다른 테이블에서 ID 목록을 얻을 것이다. 이제 ID를 기반으로이 테이블에 위의 테이블을 결합하고자합니다. MIN (CreatedDate)이있는 행의 값 필드가있는 모든 고유 ID에 대해 1 행을 가져올 수있는 방식으로, 즉 특정 ID에 대한 가장 오래된 값 . 모든 행에 대한 즉, 선택된 행은 다음과 같습니다

따라서
SELECT TOP(1) * from #tblMain ORDER BY CreatedDate ASC where ID = 1 

SELECT TOP(1) * from #tblMain ORDER BY CreatedDate ASC where ID = 2...and so on. 

, 내 출력은 다음과 같이해야한다 :

 
ID Value CreatedDate    X Y Z(other columns from other tables) 
_______________________________________________________________________________ 
1 25  2011-10-11 14:00:45.910 
2 39  2011-10-14 14:00:28.910 
3 79  2011-10-25 14:00:02.910 
4 24  2011-10-26 14:00:06.910 
5 12  2011-10-26 14:03:14.910 

신뢰 나, 나는 명확로 내 요구 사항을 제시하기 위해 최선을 시도했습니다 나는 분명히 불명확 한 것이 있다면 여전히 알려줄 것입니다. 빠른 응답을 기대합니다. 감사.

답변

5

시도 :

select m.ID, m.Value, m.CreatedDate, o.x, o.y, o.z 
from (select tM.*, row_number() over (partition by ID order by CreatedDate) rn 
     from #tblMain tM) m 
left join otherTable o on m.ID = o.ID 
where m.rn=1 
+0

row_number에()가 누락되었습니다. 그러나이 쿼리를 실행 한 후에도 고유 ID, 즉 모든 ID에 대해 하나의 행을 얻지 못합니다. – MrClan

+2

@PratikChandra : 감사합니다. 생략 된'()'을 수정했습니다. ID가 누락되었거나 특정 ID에 대해 여러 행이 표시됩니까? 전자의 경우 다른 테이블에 모든 ID에 해당하는 레코드가없는 것처럼 들립니다. 수정 된 쿼리와 같이 외부 조인으로 변경하면이를 수정해야합니다. 후자의 경우 다른 테이블에 일부 ID에 대해 여러 개의 해당 레코드가있는 것처럼 들리 -이 경우 다른 테이블에 대한 링크 조건을 구체화해야합니다. –

+0

@PratikChandra : 다른 테이블이 없다면,이 대답은 당신에게'# tblMain'의 모든 고유 ID를 확실히 제공합니다. Mark가 이미 설명했듯이 문제는 다른 테이블에 있어야합니다. –

1
SELECT T1.ID,T1.Value,T1.CreateDate, T2Col1,.. 
FROM T2 INNER JOIN 
    (
    SELECT ID,Value,CreateDate, 
     Row_Number() OVER (ORDER BY CreateDate) AS R1, 
     Rank() OVER (ORDER BY CreateDate) AS R2 
    FROM #tblMain 
    ) T1 ON T2.ID = T1.ID 
WHERE T1.R1 = T1.R2 
+0

그것은 작동하지 않습니다. 이 쿼리는 위에서 언급 한 선택 기준에 따라 ID 당 하나의 행을 필요로하는 반면 고유 ID 만 가져 오지 않습니다. – MrClan

0
select 
    Main.ID 
    ,Main.Value 
    ,Main.CreateDate 
    ,MyOtherTable.X 
    ,MyOtherTable.Y 
    ,MyOtherTable.Z 
from 
    #tblMain Main 
    inner join --this sub-query returns the unique ids with the min create dates 
     (select 
      ID 
      ,MIN(CreateDate) as CreateDate 
     from 
      #tblMain 
     group by 
      ID) MinDates 
     on MinDates.CreateDate = Main.CreateDate 
      and MinDates.ID = Main.ID 
    left join MyOtherTable 
     on MyOtherTable.ID = Main.ID