Supondo que a tabela de auditoria também registre o
lease_period coluna de chave primária, referenciada aqui lp_id para simplificar, você pode tentar a seguinte abordagem:-
Encontre todas as linhas em queaudit_typeé'Updated'.
-
Classifique todas as linhas poraudit_datee particionando-os porlp_id.
-
Classifique as linhas poraudit_dateparticionamento porlp_id, suite_id, lease_id, building_id.
-
Obtenha a diferença entre os dois rankings.
-
Classifique as linhas novamente poraudit_date, particionando-os agora porlp_id, suite_id, lease_id, building_id, (ranking_difference).
-
Emita todas as linhas em que o último valor de classificação é 2 ou maior.
As primeiras quatro etapas resultam em um conjunto de linhas em que cada grupo de números consecutivos (em ordem crescente de
audit_date ) com valores idênticos de suite_id, lease_id, building_id para o mesmo lp_id será distinguido exclusivamente por um valor calculado como a diferença entre as classificações #2 e #3. Dentro do grupo, cada linha, a partir da segunda, será diferente da anterior apenas no valor de
tenant_trading_name , que é exatamente o que precisamos. Assim, classificamos as linhas mais uma vez, levando em consideração o 'ID do grupo' que acabamos de obter, e retornamos cada linha com a classificação 2 ou superior. Aqui está uma implementação 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
Observação. Isso pressupõe que a tabela de auditoria registra apenas alterações reais, ou seja, não pode haver duas linhas consecutivas com a mesma chave primária em que todas as quatro colunas tenham valores idênticos.