2017-07-07 3 views
1

私は必要な情報をあまりにも多く取り込むSQLクエリを持っています。IDごとに2つのユニークな回答を返す

USE LetterGeneration 

SELECT g.LetterGenerationTemplateRequestId, 
     cast(H.CreatedDate as time) as Time, 
     s.StatusKey 

FROM LetterGenerationStatusHistory H 

INNER JOIN LetterGenerationStatus S 
ON H.LetterGenerationStatusId = s.LetterGenerationStatusId 
INNER JOIN LetterGeneration G 
ON g.LetterGenerationId = h.LetterGenerationId 

WHERE g.LetterGenerationTemplateRequestId IN (SELECT [LetterGenerationTemplateRequestId] 
             FROM [LetterGenerationTemplateRequest] 
             WHERE CreatedDate >= DATEADD(day,-90, GETDATE())) 
AND (s.StatusKey = 'QC1' 
OR s.StatusKey = 'Ready') 


ORDER BY LetterGenerationTemplateRequestId, h.CreatedDate ASC 

私は次のようになります結果:私の現在のクエリは次のようになります私が欲しいもの

LetterGenerationTemplateRequestId Time   StatusKey 
1732189       01:14:24.1700000 QC1 
1732189       10:13:25.4730000 READY 
1732190       01:14:26.6600000 QC1 
1732190       01:14:26.7230000 QC1 
1732190       01:14:26.7970000 QC1 
1732190       01:14:26.8770000 QC1 
1732190       01:14:26.9500000 QC1 
1732190       01:14:27.0370000 QC1 
1732190       01:14:27.1100000 QC1 
1732190       04:29:17.7170000 READY 
1732190       04:29:33.8500000 READY 
1732190       04:29:50.7900000 READY 

をステータスQC1と状態READYである各リクエストIDのための唯一の1の結果を確認することです。だから、理想的には、次のようになりたい:

Request ID Time Status 
1732189 1:14:24 AM QC1 
1732189 10:13:25 AM READY 
1732190 1:14:27 AM QC1 
1732190 4:29:18 AM READY 
1732191 1:14:30 AM QC1 
1732191 4:39:28 AM READY 

など

のみIDあたり1件のステータス結果を表示する方法を、私は結果を制限することができますか?私はここでいくつかの他の質問をチェックし、それらを私のクエリに合うように調整しようとしましたが、私の限られた知識しかないので、非常に困難でした。

+0

ご使用のデータベースで質問にタグを付けてください。 –

+0

使用しているデータベースはどれですか(質問にタグを付けてください)。各ID /ステータスごとに表示する時刻はどれですか? – Bohemian

+0

データベース名がLetterGenerationで、Microsoft SQL Server Management Studio 2008を使用しています –

答えて

1

あなたはrow_number()を使用することができます。

SELECT t.* 
FROM (SELECT g.LetterGenerationTemplateRequestId, 
      cast(H.CreatedDate as time) as Time, 
      s.StatusKey, 
      ROW_NUMBER() OVER (PARTITION BY g.LetterGenerationTemplateRequestId, s.StatusKey 
           ORDER BY H.CreatedDate DESC 
           ) as seqnum 
     FROM LetterGenerationStatusHistory H INNER JOIN 
      LetterGenerationStatus S 
      ON H.LetterGenerationStatusId = s.LetterGenerationStatusId INNER JOIN 
      LetterGeneration G 
      ON g.LetterGenerationId = h.LetterGenerationId 
     WHERE g.LetterGenerationTemplateRequestId IN (SELECT [LetterGenerationTemplateRequestId] 
                FROM [LetterGenerationTemplateRequest] 
                WHERE CreatedDate >= DATEADD(day,-90, GETDATE()) 

              ) AND 
      s.StatusKey IN ('QC1', 'Ready') 
     ) t 
WHERE seqnum <= 1 
ORDER BY LetterGenerationTemplateRequestId, CreatedDate ASC; 

ROW_NUMBER()構文でORDER BYが希望行を指定します。この場合、最新の行です。

外部WHEREの "1"を変更して、グループごとに必要な数の行を取得できます。

+0

これを試すと、最後のWHERE句のすぐ上にある単一の "t"にエラーが発生します –

+0

"t"閉じ括弧)といくつかの結果が得られていますが、QC1ステータスでなくREADYステータスのみです。 –

+0

@ D.Morley。 。 。質問の誤解。ステータスを 'by by by by by by partition by 'だけに追加してください。 –

関連する問題