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:
-
Encuentre todas las filas donde
audit_typees'Updated'. -
Clasifique todas las filas por
audit_datey particionarlos porlp_id. -
Clasifique las filas por
audit_datepartición porlp_id, suite_id, lease_id, building_id. -
Obtenga la diferencia entre las dos clasificaciones.
-
Clasifique las filas nuevamente por
audit_date, dividiéndolos ahora porlp_id, suite_id, lease_id, building_id, (ranking_difference). -
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.