sql >> Databáze >  >> RDS >> Sqlserver

SQL dotaz pro výběr entit z tabulky změn historie

Z toho, co jsem četl, předpokládám, že chcete všechny společnosti, které měly status 1, ve vašem časovém období. Pokud je to to, co chcete, je to docela snadné.

Následující příkaz by měl fungovat:

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

Vytvořil jsem vnořené zobrazení s posledním stavem do konce vašeho časového období, takže pokud je poslední změna stavu společnosti 1, měla by být tato společnost zahrnuta do vašeho výsledku. Nestaráme se o změny po vašem časovém období, proto jsem omezení vložil do vnořeného zobrazení.

Začátek vašeho rozsahu je pro tento požadavek bezvýznamný. Pravděpodobně jste potřebovali pro jiné účely, abyste se připojili k jiným stolům.

Jsem člověk od Oracle, takže si myslím, že bych mohl toto prohlášení udělat mnohem lépe pomocí analytiky Oracle, ale myslím, že to bude platné prohlášení pro SQL server.



  1. Stránkování v SQL Server pomocí OFFSET/FETCH

  2. Jak napsat kód v Oracle SQL (jako 'CCYYMMDD' do 102)

  3. 5 způsobů, jak zkontrolovat, zda tabulka v MySQL existuje

  4. jak volat funkci ve funkci plsql