sql >> Database teknologi >  >> RDS >> Sqlserver

Spørg hjælp ved brug af revisionstabel

Forudsat at revisionstabellen også logger lease_period primær nøglekolonne, der henvises til her lp_id For nemheds skyld kan du prøve følgende fremgangsmåde:

  1. Find alle rækkerne hvor audit_type er 'Updated' .

  2. Ranger alle rækkerne efter audit_date og partitionere dem med lp_id .

  3. Rangér rækkerne efter audit_date partitionering af lp_id, suite_id, lease_id, building_id .

  4. Få forskellen mellem de to placeringer.

  5. Ranger rækkerne igen efter audit_date , partitionere dem nu med lp_id, suite_id, lease_id, building_id, (ranking_difference) .

  6. Udskriv alle rækker, hvor den sidste rangeringsværdi er 2 eller større.

De første fire trin resulterer i et rækkesæt, hvor hver gruppe af på hinanden følgende (i stigende rækkefølge efter audit_date ) rækker med identiske værdier for suite_id, lease_id, building_id for den samme lp_id vil blive entydigt kendetegnet ved en værdi beregnet som forskellen mellem placeringerne #2 og #3.

Inden for gruppen vil hver række, startende fra den anden, kun adskille sig fra den foregående med værdien tenant_trading_name , hvilket er lige hvad vi har brug for. Så vi rangerer rækkerne igen under hensyntagen til det "gruppe-id", vi lige har fået, og returnerer derefter hver række med rangeringen 2 eller højere.

Her er en omtrentlig 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

Bemærk. Dette forudsætter, at revisionstabellen kun logger reelle ændringer, dvs. der kan ikke være to på hinanden følgende rækker med den samme primærnøgle, hvor alle fire kolonner har identiske værdier.



  1. Cayenne, Postgres:primær nøglegenerering

  2. Bestilling af varer med matchende tags efter antal tags, der matcher

  3. psql:FATAL:adgangskodegodkendelse mislykkedes for bruger Windows 8

  4. Ingen bufferplads tilgængelig (maksimal forbindelse nået?) Form Postgres EDB Driver