Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Query SQL per la selezione di entità da una tabella delle modifiche della cronologia

Da quello che ho letto presumo che tu voglia tutte le aziende con lo stato 1 all'interno del tuo intervallo di date. Se questo è quello che vuoi, è abbastanza facile.

La seguente affermazione dovrebbe fare il lavoro:

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

Quello che ho fatto è stato creare una vista nidificata con l'ultimo stato fino alla fine dell'intervallo di date, quindi se l'ultima modifica dello stato di una società è 1, questa società dovrebbe essere inclusa nel risultato. Non ci interessano le modifiche dopo il tuo intervallo di date, quindi ho inserito la restrizione nella visualizzazione nidificata.

L'inizio del tuo intervallo è insignificante per questa richiesta. Probabilmente ti serviva per altri scopi, per unirti ad altri tavoli.

Sono un ragazzo Oracle, quindi penso che potrei fare questa affermazione molto meglio usando Oracle Analytics, ma penso che sarà una dichiarazione valida per SQL Server.