Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Requête SQL pour sélectionner des entités à partir d'une table de modification d'historique

D'après ce que j'ai lu, je suppose que vous voulez toutes les entreprises qui avaient le statut 1 dans votre plage de dates. Si c'est ce que vous voulez, c'est assez facile.

La déclaration suivante devrait faire l'affaire :

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

Ce que j'ai fait était de créer une vue imbriquée avec le dernier statut jusqu'à la fin de votre plage de dates, donc si le dernier changement de statut d'une entreprise est 1, cette entreprise doit être incluse dans votre résultat. Nous ne nous soucions pas des changements après votre plage de dates, j'ai donc placé la restriction dans la vue imbriquée.

Le début de votre plage est insignifiant pour cette requête. Vous en avez probablement eu besoin à d'autres fins, pour rejoindre d'autres tables.

Je suis un gars d'Oracle, donc je pense que je pourrais améliorer cette déclaration en utilisant Oracle Analytics, mais je pense que ce sera une déclaration valide pour le serveur SQL.