Forudsat at revisionstabellen også logger lease_period
primær nøglekolonne, der henvises til her lp_id
For nemheds skyld kan du prøve følgende fremgangsmåde:
-
Find alle rækkerne hvor
audit_type
er'Updated'
. -
Ranger alle rækkerne efter
audit_date
og partitionere dem medlp_id
. -
Rangér rækkerne efter
audit_date
partitionering aflp_id, suite_id, lease_id, building_id
. -
Få forskellen mellem de to placeringer.
-
Ranger rækkerne igen efter
audit_date
, partitionere dem nu medlp_id, suite_id, lease_id, building_id, (ranking_difference)
. -
Udskriv alle rækker, hvor den sidste rangeringsværdi er 2 eller større.
De første fire trin resulterer i et rækkesæt, hvor hver gruppe af på hinanden følgende (i stigende rækkefølge efter audit_date
) rækker med identiske værdier for suite_id, lease_id, building_id
for den samme lp_id
vil blive entydigt kendetegnet ved en værdi beregnet som forskellen mellem placeringerne #2 og #3.
Inden for gruppen vil hver række, startende fra den anden, kun adskille sig fra den foregående med værdien tenant_trading_name
, hvilket er lige hvad vi har brug for. Så vi rangerer rækkerne igen under hensyntagen til det "gruppe-id", vi lige har fået, og returnerer derefter hver række med rangeringen 2 eller højere.
Her er en omtrentlig implementering:
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
Bemærk. Dette forudsætter, at revisionstabellen kun logger reelle ændringer, dvs. der kan ikke være to på hinanden følgende rækker med den samme primærnøgle, hvor alle fire kolonner har identiske værdier.