2016-05-31 2 views
0

특정 ID에 여러 개의 리비전을 포함 할 수있는 SQL Server 쿼리를 작성하려고하지만 시작 상태와 현재/종료 상태 만 가져 오려고합니다. 나는 그 길을 따라 무엇이 일어 났는지 항상 신경 쓰지 않는다.캡처 할 SQL 쿼리 시작 및 끝 리비전 상태

다음은 현재 데이터베이스 구조의 샘플입니다 (데이터가 정렬 될 것이라고 가정 할 수 없음).

ID  REV STATUS CURRENT  NOTES 
---------------------------------------------- 
1111 1  High  F  Note One 
1111 2  High  F  Note Two 
1111 3  Medium  F  Note Three 
1111 4  Medium  F  Note Four 
1111 5  Medium  F  Note Five 
1111 6  Medium  F  Note Six 
1111 7  Complete T  Note Seven 
2222 1  Medium  F  Note One 
2222 2  High  F  Note Two 
2222 3  Complete T  Note Three 
3333 1  Low  T  Note One 
4444 1  Low  F  Note One 
4444 2  Medium  T  Note Two 

여기 내 원하는 출력입니다.

ID  START STATUS  END STATUS  END NOTE 
--------------------------------------------------- 
1111 High    Complete  Note Seven 
2222 Medium   Complete  Note Three 
3333 Low    Low   Note One 
4444 Low    Medium   Note Two 

모든 도움을 주시면 감사하겠습니다.

+0

항상 가장 낮은 개정 1인가? – RBarryYoung

+0

@RBarryYoung 예. REV = 1이 항상 있습니다. – rak11

답변

4

는 처음 엔 내가 ... 실제로 가까운 질문을 읽고 나면 ... 그냥 처음과 마지막 행을 원하고 나는 current 열을 발견하지 않았

select * from 
     (
     select * 
      row_number() over (partition by id order by rev asc) rnA, 
      row_number() over (partition by id order by rev desc) rnD 
     from <table> revs 
     ) r 
    where rnA = 1 or rnD = 1 

생각

select 
    id, 
    min(case when rev = 1 then status end) as "Start Status", 
    min(case when current = 'T' then status end) as "End Status", 
    min(case when current = 'T' then status end) as "End Note" 
from <table> rev 
group by id 
+1

응답 해 주셔서 감사합니다. 내가 스스로를 봐야만하는 간단한 해결책. 고맙습니다. – rak11

0

현재 개정판 인 모든 행을 가져온 다음 첫 번째 개정판의 상태를 추가하면됩니다. 여기에 한 가지 방법입니다 :

SELECT ID, 
    (SELECT [STATUS] FROM MyTable t2 WHERE t2.ID = MyTable.ID AND t2.REV = 1) AS [START STATUS], 
    [STATUS] AS [END STATUS], NOTES AS [END NOTE] 
FROM MyTable 
WHERE [CURRENT] = 'T' 
당신은 또한뿐만 아니라 첫 번째 개정에 가입 할 수

:

SELECT ID, 
    Rev1.[STATUS] AS [START STATUS], 
    [STATUS] AS [END STATUS], NOTES AS [END NOTE] 
FROM MyTable 
    INNER JOIN MyTable Rev1 
     ON MyTable.ID = Rev1.ID 
      AND Rev1.REV = 1 
WHERE MyTable.[CURRENT] = 'T' 
0
select ID, 
    iif(REV=1,STATUS,null) [START STATUS], 
    iif(maxrev is null,null,STATUS) as [END STATUS], 
    iif(maxrev is null,null,NOTES) as [END NOTE] 
from <tablename,,> t1 
left join (select ID, max(REV) maxrev from <tablename,,> group by ID) t2 
    on t1.ID=t2.ID and t1.rev=t2.maxrev 
group by ID, 
    [START STATUS], 
    [END STATUS], 
    [END NOTE] 
+1

'maxrev'는 왜 null이 될까요? ;) – shawnt00

+0

whoops가 왼쪽 가입이어야합니다! – Matt

+0

아니요. * null이되지 않습니다. MySQL에 대한 쿼리를 작성한 것처럼 보이지만 원하는대로 작동하지 않을 것이라고 생각합니다. 당신은'maxrev' 질의에'group by '을 놓치고 있고 당신의'iif()'조건은 조금 벗어났습니다. 나는 당신이 그것으로 주변에 놀 n 것을 고무 할 것입니다. – shawnt00