2017-04-17 15 views
0

他のいくつかの質問を検索しましたが、正しい結果が得られないようです。 DocumentテーブルのすべてのレコードをCaseIdに基づいて取得し、最新のStatusを取得したいと考えています。最新の日付を使用している状態のsql

ドキュメント:

DocumentId | CaseId | Name 
---------------------------------------- 
2   |  23  | Document 1 
3   |  23  | Document 2 
4   |  24  | Document 3 

監査ログ:

AuditLogId | Status | DocumentId | Date Created 
--------------------------------------------------------- 
10   | Active |  2  | 4/2/2017 
11   | Draft |  2  | 4/1/2017 
12   | Released |  2  | 4/3/2017 
13   | Draft |  3  | 4/17/2017 
14   | Draft |  4  | 4/17/2017 

のでCaseId: 23ための所望の結果は次のようになります。

Status | DocumentId | CaseId | Name 
---------------------------------------------- 
Released |  2  | 23 | Document 1 
Draft  |  3  | 23 | Document 2 

私が持っている私は2つのテーブルを持っています近くにこのクエリで、しかし、これが唯一のむしろDocumentIdによってグループ化するよりも、私にCaseId 23ためのすべての結果の最新を与える:

Select s.Status, lh.* from LegalHold lh join(
    Select Status, LegalHoldId 
    FROM LegalHoldAuditLog 
    WHERE DateCreated = (select max(DateCreated) 
    from LegalHoldAuditLog)) s on lh.LegalHoldId = s.LegalHoldId 
    WHERE lh.CaseId = 23 
+1

することはあり '文書ID = 3 'のためのちょうど1つのレコードが' AuditLog'テーブルであり、この記録は、 'ステータス= Draft'を持っています。どのように結果に「アクティブ」がありますか? –

+0

@GiorgosBetsosおそらくDocumentIdフィールドと混同されている可能性があります。 –

+0

@GiorgosBetsosはい私の間違い私は結果を更新しました – user2884789

答えて

2

cross apply()を使用すると、それぞれDocumentIdの最新Statusが得られます。

select d.*, al.Status 
from Document d 
    cross apply (
    select top 1 i.Status 
    from AuditLog i 
    where i.DocumentId = d.DocumentId 
    order by i.date_created desc 
    ) as al 
where d.CaseId = 23 

top with tiesrow_number()を使用したバージョン:

select top 1 with ties d.*, al.Status 
from Document d 
    inner join AuditLog al 
    on d.DocumentId = al.DocumentId 
order by row_number() over (partition by al.DocumentId order by al.date_created desc) 
+1

'トップでネクタイ'は素晴らしいです! –

+0

@SqlZimトップのネクタイがうまくいきました。しかし、私は 'partition by'でカッコ内のあいまいに変更しました。そうでなければうまくいきませんでした。それがあなたの間違いではないかどうか私に教えてください。 – user2884789

+0

@ user2884789タイプミスでした。更新しました – SqlZim

0

私は、これはそれを行うための少なくとも一つの方法だろうと思います。

AuditLogテーブルのDate Createdカラムに従って、最新行のStatusの値だけが必要です。

SELECT (SELECT TOP 1 Status 
     FROM AuditLog 
     WHERE AuditLog.DocumentId = Document.DocumentId 
     ORDER BY [Date Created] DESC), 
     DocumentId, CaseId, Name 
FROM Document 
WHERE CaseId = 23 

また、ドキュメント2の値を「ドラフト」にしないでください。

0

あなたはAuditLogテーブルのレコードを優先させるためにROW_NUMBERCommon Table Expressionを使用することができます。次に予想される結果を得るためにDocumentテーブルへの結合:

;WITH AuditLog_Rn AS (
    SELECT Status, DocumentId, 
      ROW_NUMBER() OVER (PARTITION BY DocumentId 
          ORDER BY [Date Created] DESC) AS rn 
    FROM AuditLog 
) 
SELECT d.DocumentId, d.CaseId, d.Name, al.Status 
FROM Document AS d 
JOIN AuditLog_Rn AS al ON d.DocumentId = al.DocumentId AND al.rn = 1 
関連する問題