Ervan uitgaande dat de audittabel ook de lease_period
registreert kolom primaire sleutel, waarnaar hier wordt verwezen lp_id
voor de eenvoud kunt u de volgende aanpak proberen:
-
Zoek alle rijen waar
audit_type
is'Updated'
. -
Rangschik alle rijen op
audit_date
en ze te partitioneren doorlp_id
. -
Rangschik de rijen op
audit_date
partitionering doorlp_id, suite_id, lease_id, building_id
. -
Ontdek het verschil tussen de twee ranglijsten.
-
Rangschik de rijen opnieuw op
audit_date
, verdeel ze nu doorlp_id, suite_id, lease_id, building_id, (ranking_difference)
. -
Voer alle rijen uit waarvan de laatste rangschikking 2 of hoger is.
De eerste vier stappen resulteren in een reeks rijen waarin elke groep opeenvolgende (in oplopende volgorde van audit_date
) rijen met identieke waarden van suite_id, lease_id, building_id
voor dezelfde lp_id
zal uniek worden onderscheiden door een waarde die wordt berekend als het verschil tussen de rangschikkingen #2 en #3.
Binnen de groep zal elke rij, beginnend bij de tweede, alleen verschillen van de vorige in de waarde van tenant_trading_name
, dat is precies wat we nodig hebben. We rangschikken de rijen dus opnieuw, rekening houdend met de 'groeps-ID' die we zojuist hebben verkregen, en retourneren elke rij met de rangorde van 2 of hoger.
Hier is een geschatte implementatie:
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
Opmerking. Dit veronderstelt dat de controletabel alleen echte wijzigingen registreert, d.w.z. er kunnen geen twee opeenvolgende rijen zijn met dezelfde primaire sleutel waarbij alle vier de kolommen identieke waarden hebben.