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:
-
Znajdź wszystkie wiersze, w których
audit_type
jest'Updated'
. -
Uporządkuj wszystkie wiersze według
audit_date
i partycjonowanie ich wedługlp_id
. -
Uporządkuj wiersze według
audit_date
partycjonowanie wedługlp_id, suite_id, lease_id, building_id
. -
Uzyskaj różnicę między tymi dwoma rankingami.
-
Ponownie uszereguj wiersze według
audit_date
, dzieląc je teraz wedługlp_id, suite_id, lease_id, building_id, (ranking_difference)
. -
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.