Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Fragen Sie die Hilfe ab, wenn Sie die Audit-Tabelle verwenden

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:

  1. Suchen Sie alle Zeilen mit audit_type ist 'Updated' .

  2. Ordnen Sie alle Zeilen nach audit_date und Partitionierung nach lp_id .

  3. Ordnen Sie die Zeilen nach audit_date Partitionierung nach lp_id, suite_id, lease_id, building_id .

  4. Holen Sie sich den Unterschied zwischen den beiden Rankings.

  5. Ordnen Sie die Zeilen erneut nach audit_date , und partitioniere sie jetzt nach lp_id, suite_id, lease_id, building_id, (ranking_difference) .

  6. 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.