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_date
e particionando-os porlp_id
.
-
Classifique as linhas poraudit_date
particionamento 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.