2017-04-17 3 views
0

Ich habe mehrere andere SO-Fragen durchsucht, aber ich kann immer noch nicht das richtige Ergebnis erhalten. Ich würde gerne alle Datensätze aus der Document Tabelle basierend auf CaseId und mit den neuesten Status bekommen. Ich habe zwei Tabellen:sql für Status mit dem neuesten Datum

Dokument:

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

auditlog:

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 

So das gewünschte Ergebnis für CaseId: 23 wäre:

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

Ich habe haben schließen mit dieser Abfrage, aber das gibt mir nur die letzte aller Ergebnisse für CaseId 23, anstatt die Gruppierung von DocumentId:

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

Es gibt nur einen Datensatz für 'DocumentId = 3' in der' AuditLog' Tabelle, und diese Platte hat 'Status = Draft'. Wie kommt es, dass du 'Aktiv' im Ergebnis hast? –

+0

@GiorgosBetsos Wahrscheinlich wurde gerade mit dem Feld DocumentId verwechselt. –

+0

@GiorgosBetsos Ja mein Fehler Ich habe das Ergebnis aktualisiert – user2884789

Antwort

2

mit cross apply(), um die neuesten Status für jeden DocumentId zu erhalten.

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 ties Version row_number() mit:

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

'Top mit Krawatten' ist ein netter! –

+0

@SqlZim Top mit Verbindungen funktionierte gut, aber ich habe ah zu al in der Klammer mit 'Partition von' geändert, sonst hat es nicht funktioniert. Bitte lassen Sie mich wissen, ob das kein Fehler für Sie war. – user2884789

+0

@ user2884789 War ein Tippfehler. Aktualisiert – SqlZim

0

ich denke, das ist wenigstens ein Weg sein würde, es zu tun.

Sie benötigen nur den Wert von Status aus der letzten Zeile, entsprechend der Spalte Erstelldatum in der AuditLog-Tabelle.

Und sollte nicht der Wert für Dokument 2 "Entwurf" sein?

0

Sie können eine Common Table Expression mit ROW_NUMBER verwenden, um zu priorisieren Aufzeichnungen AuditLog Tabelle. Dann kommen Sie zu Document Tabelle erwartetes Ergebnis zu erhalten:

;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 
Verwandte Themen