sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-fråga för att välja entiteter från en historikändringstabell

Av vad jag läst antar jag att du vill ha alla företag som hade status 1 inom ditt datumintervall. Om det här är vad du vill är det ganska enkelt.

Följande uttalande bör göra jobbet :

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

Det jag gjorde var att skapa en kapslad vy med den senaste statusen fram till slutet av ditt datumintervall, så om den senaste ändringen av en företagsstatus är 1 så ska detta företag inkluderas i ditt resultat. Vi bryr oss inte om ändringar efter ditt datumintervall, så jag lägger in begränsningen i den kapslade vyn.

Början av ditt intervall är obetydlig för denna begäran. Du behövde förmodligen för andra ändamål, att gå med i andra bord.

Jag är Oracle-kille, så jag tror att jag skulle kunna göra detta uttalande mycket bättre med Oracle-analys, men jag tror att det kommer att vara ett giltigt uttalande för SQL-server.



  1. mySQL MATCH över flera bord

  2. SQL-fråga minst en av något

  3. MySQLi - deklarerar variabel efter bind_param?

  4. Finns det något sätt att ge en underfråga ett alias i Oracle 11g SQL?