2016-05-31 6 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()'条件はちょっとありません。私はあなたと一緒に遊ぶことをお勧めします。 – shawnt00

関連する問題