Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Abfrage zum Auswählen von Entitäten aus einer Verlaufsänderungstabelle

Nach dem, was ich gelesen habe, gehe ich davon aus, dass Sie alle Unternehmen mit Status 1 in Ihrem Datumsbereich haben möchten. Wenn Sie das möchten, ist das ziemlich einfach.

Die folgende Anweisung sollte die Arbeit erledigen:

SELECT C.*
  FROM COMPANY C
  LEFT JOIN ( SELECT H.STATUS, H.COMPANY_ID
                FROM COMPANYSTATUS H
               WHERE H.STATUS_EFFECTIVE_DATE = (SELECT MAX(H1.STATUS_EFFECTIVE_DATE)
                                                  FROM COMPANYSTATUS H1
                                                 WHERE H1.COMPANY_ID = H.COMPANY_ID
                                                   AND H1.STATUS_EFFECTIVE_DATE <= '20171231'
             ) CH ON CH.COMPANY_ID = C.ID   
 WHERE ( C.STATUS = 1 AND CH.COMPANY_ID IS NULL ) -- CASE #1 : STATUS = 1 AND NEVER CHANGED (NO HISTORY)
    OR H.STATUS = 1

Ich habe eine verschachtelte Ansicht mit dem letzten Status bis zum Ende Ihres Datumsbereichs erstellt. Wenn also die letzte Änderung eines Unternehmensstatus 1 ist, sollte dieses Unternehmen in Ihrem Ergebnis enthalten sein. Änderungen nach Ihrem Datumsbereich sind uns egal, daher habe ich die Einschränkung in die verschachtelte Ansicht eingefügt.

Der Beginn Ihres Bereichs ist für diese Anfrage unerheblich. Sie werden wahrscheinlich für andere Zwecke benötigt, um anderen Tischen beizutreten.

Ich bin ein Oracle-Typ, also denke ich, dass ich diese Aussage mit Oracle Analytics viel besser machen könnte, aber ich denke, es wird eine gültige Aussage für SQL Server sein.