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

Richiedere la guida quando si utilizza la tabella di controllo

Supponendo che la tabella di controllo registri anche il lease_period colonna della chiave primaria, a cui si fa riferimento qui lp_id per semplicità, potresti provare il seguente approccio:

  1. Trova tutte le righe in cui audit_type è 'Updated' .

  2. Classifica tutte le righe per audit_date e partizionarli per lp_id .

  3. Classifica le righe per audit_date partizionamento per lp_id, suite_id, lease_id, building_id .

  4. Ottieni la differenza tra le due classifiche.

  5. Classifica nuovamente le righe in base a audit_date , partizionandoli ora per lp_id, suite_id, lease_id, building_id, (ranking_difference) .

  6. Genera tutte le righe in cui l'ultimo valore di classifica è 2 o superiore.

I primi quattro passaggi danno come risultato un insieme di righe in cui ogni gruppo di consecutivi (in ordine crescente di audit_date ) righe con valori identici di suite_id, lease_id, building_id per lo stesso lp_id sarà contraddistinto in modo univoco da un valore calcolato come differenza tra le classifiche n. 2 e n. 3.

All'interno del gruppo, ogni riga, a partire dalla seconda, differirà dalla precedente solo per il valore di tenant_trading_name , che è proprio ciò di cui abbiamo bisogno. Quindi, classifichiamo nuovamente le righe, tenendo conto dell'"ID gruppo" che abbiamo appena ottenuto, quindi restituiamo ogni riga con la classifica di 2 o superiore.

Ecco un'implementazione approssimativa:

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

Nota. Ciò presuppone che la tabella di controllo registri solo le modifiche reali, ovvero non possono esserci due righe consecutive con la stessa chiave primaria in cui tutte e quattro le colonne hanno valori identici.