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_type
es'Updated'
. -
Clasifique todas las filas por
audit_date
y particionarlos porlp_id
. -
Clasifique las filas por
audit_date
partició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.