Angenommen, die Audit-Tabelle protokolliert auch die lease_period
Primärschlüsselspalte, hier referenziert lp_id
Der Einfachheit halber könnten Sie den folgenden Ansatz ausprobieren:
-
Suchen Sie alle Zeilen mit
audit_type
ist'Updated'
. -
Ordnen Sie alle Zeilen nach
audit_date
und Partitionierung nachlp_id
. -
Ordnen Sie die Zeilen nach
audit_date
Partitionierung nachlp_id, suite_id, lease_id, building_id
. -
Holen Sie sich den Unterschied zwischen den beiden Rankings.
-
Ordnen Sie die Zeilen erneut nach
audit_date
, und partitioniere sie jetzt nachlp_id, suite_id, lease_id, building_id, (ranking_difference)
. -
Alle Zeilen ausgeben, bei denen der letzte Rangfolgewert 2 oder größer ist.
Die ersten vier Schritte führen zu einem Zeilensatz, in dem jede Gruppe aufeinanderfolgender (in aufsteigender Reihenfolge von audit_date
) Zeilen mit identischen Werten von suite_id, lease_id, building_id
für dieselbe lp_id
wird eindeutig durch einen Wert unterschieden, der sich aus der Differenz zwischen den Rängen #2 errechnet.
Innerhalb der Gruppe unterscheidet sich jede Zeile, beginnend mit der zweiten, von der vorherigen nur im Wert von tenant_trading_name
, das ist genau das, was wir brauchen. Also ordnen wir die Zeilen erneut unter Berücksichtigung der soeben erhaltenen 'Gruppen-ID' und geben dann jede Zeile mit der Rangfolge 2 oder höher zurück.
Hier ist eine ungefähre Implementierung:
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
Notiz. Dies setzt voraus, dass die Audit-Tabelle nur echte Änderungen protokolliert, d. h. es kann keine zwei aufeinanderfolgenden Zeilen mit demselben Primärschlüssel geben, bei denen alle vier Spalten identische Werte haben.