Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Demander de l'aide lors de l'utilisation de la table d'audit

En supposant que la table d'audit enregistre également la lease_period colonne de clé primaire, référencée ici lp_id pour plus de simplicité, vous pouvez essayer l'approche suivante :

  1. Trouver toutes les lignes où audit_type est 'Updated' .

  2. Classez toutes les lignes par audit_date et les partitionner par lp_id .

  3. Classez les lignes par audit_date partitionnement par lp_id, suite_id, lease_id, building_id .

  4. Obtenez la différence entre les deux classements.

  5. Classez à nouveau les lignes par audit_date , en les partitionnant maintenant par lp_id, suite_id, lease_id, building_id, (ranking_difference) .

  6. Sortez toutes les lignes où la dernière valeur de classement est 2 ou plus.

Les quatre premières étapes aboutissent à un ensemble de lignes où chaque groupe de données consécutives (dans l'ordre croissant de audit_date ) lignes avec des valeurs identiques de suite_id, lease_id, building_id pour le même lp_id sera distingué de manière unique par une valeur calculée comme la différence entre les classements #2 et #3.

Au sein du groupe, chaque ligne, à partir de la seconde, ne différera de la précédente que par la valeur de tenant_trading_name , c'est exactement ce dont nous avons besoin. Donc, nous classons à nouveau les lignes, en tenant compte de "l'ID de groupe" que nous venons d'obtenir, puis renvoyons chaque ligne avec le classement de 2 ou plus.

Voici une implémentation approximative :

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

Noter. Cela suppose que la table d'audit n'enregistre que les modifications réelles, c'est-à-dire qu'il ne peut pas y avoir deux lignes consécutives avec la même clé primaire où les quatre colonnes ont des valeurs identiques.