Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie o pomoc podczas korzystania z tabeli audytu

Zakładając, że tabela audytu rejestruje również lease_period kolumna klucza podstawowego, do której odwołuje się tutaj lp_id dla uproszczenia możesz wypróbować następujące podejście:

  1. Znajdź wszystkie wiersze, w których audit_type jest 'Updated' .

  2. Uporządkuj wszystkie wiersze według audit_date i partycjonowanie ich według lp_id .

  3. Uporządkuj wiersze według audit_date partycjonowanie według lp_id, suite_id, lease_id, building_id .

  4. Uzyskaj różnicę między tymi dwoma rankingami.

  5. Ponownie uszereguj wiersze według audit_date , dzieląc je teraz według lp_id, suite_id, lease_id, building_id, (ranking_difference) .

  6. Wypisz wszystkie wiersze, w których ostatnia wartość rankingu wynosi 2 lub więcej.

Pierwsze cztery kroki dają w wyniku zestaw wierszy, w których każda grupa kolejnych (w porządku rosnącym od audit_date ) wiersze z identycznymi wartościami suite_id, lease_id, building_id dla tego samego lp_id zostanie jednoznacznie wyróżniony wartością obliczoną jako różnica między pozycjami #2 i #3.

W ramach grupy każdy wiersz, począwszy od drugiego, będzie różnił się od poprzedniego tylko wartością tenant_trading_name , a tego właśnie potrzebujemy. Dlatego ponownie klasyfikujemy wiersze, biorąc pod uwagę właśnie otrzymany „identyfikator grupy”, a następnie zwracamy każdy wiersz z rankingiem 2 lub wyższym.

Oto przybliżona implementacja:

WITH marked AS (
  SELECT
    *,
    grp = ROW_NUMBER() OVER (PARTITION BY lp_id
                                 ORDER BY audit_date)
        - ROW_NUMBER() OVER (PARTITION BY lp_id, suite_id, lease_id, building_id
                                 ORDER BY audit_date)
  FROM lease_period_audit
  WHERE audit_type = 'Updated'
),
ranked AS (
  SELECT
    *,
    rnk = ROW_NUMBER() OVER (PARTITION BY lp_id, suite_id, lease_id, building_id, grp
                                 ORDER BY audit_date)
  FROM marked
)
SELECT
  audit_date,
  lp_id,
  tenant_trading_name,
  suite_id,
  lease_id,
  building_id
FROM ranked
WHERE rnk = 2

Notatka. Zakłada się, że tabela kontroli rejestruje tylko rzeczywiste zmiany, tj. nie mogą istnieć dwa kolejne wiersze z tym samym kluczem podstawowym, w którym wszystkie cztery kolumny mają identyczne wartości.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć funkcję rozpoczęcia i zakończenia czasu letniego w SQL Server

  2. SQL — Operandowy typ danych datetime2 jest nieprawidłowy dla operatora odejmowania

  3. Serwer SQL wybiera różne wiersze, używając wartości sprzed określonej daty

  4. Użyj TYPEPROPERTY(), aby zwrócić informacje o typie danych w SQL Server

  5. Dodawanie INDEKSU do CTE