Förutsatt att granskningstabellen också loggar lease_period
primärnyckelkolumn, refererad här lp_id
För enkelhetens skull kan du prova följande tillvägagångssätt:
-
Hitta alla rader där
audit_type
är'Updated'
. -
Rangordna alla rader efter
audit_date
och partitionera dem medlp_id
. -
Rangordna raderna efter
audit_date
partitionering medlp_id, suite_id, lease_id, building_id
. -
Få skillnaden mellan de två rankningarna.
-
Rangordna raderna igen efter
audit_date
, partitionera dem nu medlp_id, suite_id, lease_id, building_id, (ranking_difference)
. -
Skriv ut alla rader där det sista rankningsvärdet är 2 eller högre.
De första fyra stegen resulterar i en raduppsättning där varje grupp av konsekutiva (i stigande ordning efter audit_date
) rader med identiska värden för suite_id, lease_id, building_id
för samma lp_id
kommer att särskiljas unikt av ett värde som beräknas som skillnaden mellan ranking #2 .
Inom gruppen kommer varje rad, från och med den andra, att skilja sig från den föregående endast i värdet tenant_trading_name
, vilket är precis vad vi behöver. Så vi rankar raderna igen, med hänsyn till det "grupp-ID" vi just har fått, och returnerar sedan varje rad med rankningen 2 eller högre.
Här är en ungefärlig 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
Notera. Detta förutsätter att granskningstabellen endast loggar verkliga förändringar, dvs. det kan inte finnas två på varandra följande rader med samma primärnyckel där alla fyra kolumnerna har identiska värden.