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_typeist'Updated'. -
Ordnen Sie alle Zeilen nach
audit_dateund Partitionierung nachlp_id. -
Ordnen Sie die Zeilen nach
audit_datePartitionierung 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.