2015-01-11 2 views
3

쿼리를 실행하고 싶은 테이블이 2 개 있습니다. 첫 번째 테이블은 기본 키IncidentID. 번째 테이블은 기본 키ActionID을 가지며 첫 번째 테이블과 연결되는 필드 IncidentID을 가지고있다 dbo.IncidentActions 연락처 dbo.Incidents이다.Microsoft SQL 쿼리 - 두 번째 테이블에서 마지막 레코드 반환

같은 IncidentID 많은 행동이 있고 그 IncidentID의 마지막 ActionIDIncidentID 당 1 개 행을 반환하고자하고있다.

감사 Andomar은 - 거의 다 내가이 난 그냥 ia.ActionDate =에 GetDate()가 어디에서 설정하고자하는 모든 이제 작업입니다 :)

select * 
from (
     select i.IncidentID 
     ,  ia.ActionID 
     ,  RIGHT('' + CAST(DATEDIFF(mi, ia.ActionTime, CONVERT([varchar], GETDATE(), 14)) 
         /60 % 60 AS VARCHAR), 2) + ' hr(s) ' + RIGHT('' + CAST(DATEDIFF(mi, ia.ActionTime, CONVERT([varchar], GETDATE(), 14)) % 60 AS VARCHAR), 2) + ' min(s)' AS LastActionTime 

     ,  row_number() over (
        partition by i.IncidentID 
        order by ia.ActionID desc) as rn 
     from dbo.Incident i 
     join dbo.IncidentAction ia 
     on  i.IncidentID = ia.IncidentID 
     ) as SubQueryAlias 
where rn = 1 

약속 - 얻이 수없는 것 그

답변

1
작업 방금 사건 당 최고 ActionID을 찾고 있다면

다음 IncidentActions 테이블에 타임 스탬프 열이있는 경우

select i.IncidentID 
,  max(ia.ActionID) as MaxActionIdForIncident 
from Incidents i 
join IncidentActions ia 
on  i.IncidentID = ia.IncidentID 
group by 
     i.IncidentID 

당신은 whic 결정하기 위해 사용하고 싶습니다 시간 행은 당신이 row_number() 윈도우 기능을 사용할 수, 반환 : 당신이 where 절에 윈도우 기능을 사용할 수 없기 때문에 서브 쿼리가 필요

select * 
from (
     select i.IncidentID 
     ,  ia.ActionID 
     ,  ia.ActionByUser -- Note: now you return any column 
     ,  row_number() over (
        partition by i.IncidentID 
        order by ia.ActionTimestamp desc) as rn 
     from Incidents i 
     join IncidentActions ia 
     on  i.IncidentID= ia.IncidentID 
     ) as SubQueryAlias 
where rn = 1 -- Latest action per incident only 

. 더 많은 예제를 보려면 태그를 찾아보십시오.

+0

도움을 주셔서 감사합니다. 다른 Where 조건을 설정하는 데 도움을 주시면 하단의 질문을 업데이트했습니다. –

+0

'캐스팅 (ActionDate as date) = 캐스트 (getdate()로 날짜)' – Andomar

관련 문제