sql >> Base de Datos >  >> RDS >> Sqlserver

Consulta SQL para seleccionar entidades de una tabla de cambio de historial

Por lo que leí, asumo que desea que todas las empresas que tenían el estado 1 estén dentro de su rango de fechas. Si esto es lo que quieres, es bastante fácil.

La siguiente declaración debería hacer el trabajo:

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

Lo que hice fue crear una vista anidada con el último estado hasta el final de su rango de fechas, por lo que si el último cambio del estado de una empresa es 1, entonces esta empresa debería incluirse en su resultado. No nos importan los cambios posteriores a su intervalo de fechas, por lo que puse la restricción dentro de la vista anidada.

El comienzo de su rango es insignificante para esta solicitud. Probablemente lo necesite para otros fines, para unirse a otras mesas.

Soy un tipo de Oracle, así que creo que podría hacer esta declaración mucho mejor usando el análisis de Oracle, pero creo que será una declaración válida para el servidor SQL.