sql >> Base de Datos >  >> RDS >> Sqlserver

Consulta de ayuda al usar la tabla de auditoría

Suponiendo que la tabla de auditoría también registre el lease_period columna de clave principal, a la que se hace referencia aquí lp_id para simplificar, puede probar el siguiente enfoque:

  1. Encuentre todas las filas donde audit_type es 'Updated' .

  2. Clasifique todas las filas por audit_date y particionarlos por lp_id .

  3. Clasifique las filas por audit_date partición por lp_id, suite_id, lease_id, building_id .

  4. Obtenga la diferencia entre las dos clasificaciones.

  5. Clasifique las filas nuevamente por audit_date , dividiéndolos ahora por lp_id, suite_id, lease_id, building_id, (ranking_difference) .

  6. Muestra todas las filas donde el último valor de clasificación es 2 o mayor.

Los primeros cuatro pasos dan como resultado un conjunto de filas donde cada grupo de resultados consecutivos (en orden ascendente de audit_date ) filas con valores idénticos de suite_id, lease_id, building_id para el mismo lp_id se distinguirá únicamente por un valor calculado como la diferencia entre las clasificaciones n.º 2 y n.º 3.

Dentro del grupo, cada fila, a partir de la segunda, diferirá de la anterior solo en el valor de tenant_trading_name , que es justo lo que necesitamos. Entonces, clasificamos las filas una vez más, teniendo en cuenta el 'ID de grupo' que acabamos de obtener, luego devolvemos cada fila con una clasificación de 2 o superior.

Aquí hay una implementación aproximada:

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. Esto supone que la tabla de auditoría registra solo cambios reales, es decir, no puede haber dos filas consecutivas con la misma clave principal donde las cuatro columnas tengan valores idénticos.