sql >> Database >  >> RDS >> Sqlserver

SQL-query voor het selecteren van entiteiten uit een geschiedeniswijzigingstabel

Uit wat ik heb gelezen, neem ik aan dat je alle bedrijven met status 1 binnen je datumbereik wilt hebben. Als dit is wat je wilt, is dat vrij eenvoudig.

De volgende verklaring zou het werk moeten doen:

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

Wat ik deed, was een geneste weergave maken met de laatste status tot het einde van uw datumbereik, dus als de laatste wijziging van een bedrijfsstatus 1 is, moet dit bedrijf worden opgenomen in uw resultaat. We geven niet om wijzigingen na uw datumbereik, dus plaats ik de beperking in de geneste weergave.

Het begin van uw bereik is niet significant voor dit verzoek. Je had waarschijnlijk voor andere doeleinden nodig, om aan andere tafels te kunnen deelnemen.

Ik ben een Oracle-man, dus ik denk dat Ι deze verklaring veel beter zou kunnen maken met Oracle-analyse, maar ik denk dat het een geldige verklaring voor SQL-server zal zijn.



  1. Hoe json-array te converteren naar postgres int-array in postgres 9.3

  2. UnknownHostException bij het proberen verbinding te maken met heroku-postgres vanuit een lokaal Springboot-project met Spring JPA

  3. PHP, MySQL - kun je onderscheid maken tussen rijen die overeenkomen en rijen die zijn beïnvloed?

  4. Hoe een niet-opgeblazen aantal te berekenen uit een gedenormaliseerde tabel?