sql >> Databasteknik >  >> RDS >> Sqlserver

Fråga hjälp när du använder revisionstabell

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:

  1. Hitta alla rader där audit_type är 'Updated' .

  2. Rangordna alla rader efter audit_date och partitionera dem med lp_id .

  3. Rangordna raderna efter audit_date partitionering med lp_id, suite_id, lease_id, building_id .

  4. Få skillnaden mellan de två rankningarna.

  5. Rangordna raderna igen efter audit_date , partitionera dem nu med lp_id, suite_id, lease_id, building_id, (ranking_difference) .

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



  1. Hur ändrar man tid?

  2. Installation av postgresql med NSIS

  3. kan inte ange måltabell för UPDATE i FROM-satsen

  4. I MySQL kan jag returnera raderade rader efter en radering?