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

SQL-forespørgsel til at vælge enheder fra en historikændringstabel

Ud fra det, jeg læste, går jeg ud fra, at du vil have alle de virksomheder, der havde status 1, inden for dit datointerval. Hvis det er det, du ønsker, er det ret nemt.

Følgende erklæring burde gøre 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, jeg gjorde, var at oprette en indlejret visning med den sidste status indtil slutningen af ​​dit datointerval, så hvis den sidste ændring af en virksomhedsstatus er 1, skal denne virksomhed inkluderes i dit resultat. Vi er ligeglade med ændringer efter dit datointerval, så jeg sætter begrænsningen i den indlejrede visning.

Begyndelsen af ​​dit interval er ubetydelig for denne anmodning. Du havde sandsynligvis brug for andre formål, at deltage i andre borde.

Jeg er Oracle-fyr, så jeg tror, ​​jeg kunne gøre denne erklæring meget bedre ved at bruge Oracle-analyse, men jeg tror, ​​den vil være en gyldig erklæring til SQL-server.



  1. Hvordan kan jeg få forfædre-id'er til vilkårlig rekursionsdybde i én SQL-forespørgsel?

  2. Få den øverste række efter bestilling af i Oracle Subquery

  3. MySql - Sequalize - Kan ikke tilføje fremmednøglebegrænsning

  4. Brug af Conditional Aggregate i SQL Server 2008