Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Consulta SQL para selecionar entidades de uma tabela de alteração de histórico


Pelo que li, suponho que você queira todas as empresas que tiveram o status 1 dentro do seu intervalo de datas. Se é isso que você quer, isso é muito fácil.

A seguinte declaração deve fazer o trabalho:
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

O que fiz foi criar uma visualização aninhada com o último status até o final do seu intervalo de datas, portanto, se a última alteração do status de uma empresa for 1, essa empresa deverá ser incluída no seu resultado. Não nos importamos com alterações após seu período, então coloquei a restrição dentro da visualização aninhada.

O início do seu intervalo é insignificante para esta solicitação. Você provavelmente precisou para outros propósitos, juntar outras tabelas.

Eu sou o cara da Oracle, então acho que Ι poderia fazer essa declaração muito melhor usando o Oracle Analytics, mas acho que será uma declaração válida para o SQL Server.