Za předpokladu, že tabulka auditu také zaznamenává lease_period sloupec primárního klíče, zde odkazovaný lp_id pro jednoduchost můžete zkusit následující přístup:
-
Najděte všechny řádky obsahující
audit_typeje'Updated'. -
Seřaďte všechny řádky podle
audit_datea jejich rozdělení podlelp_id. -
Seřaďte řádky podle
audit_daterozdělení podlelp_id, suite_id, lease_id, building_id. -
Získejte rozdíl mezi těmito dvěma hodnoceními.
-
Seřaďte řádky znovu podle
audit_date, nyní je rozdělí podlelp_id, suite_id, lease_id, building_id, (ranking_difference). -
Vypíše všechny řádky, kde je poslední hodnota hodnocení 2 nebo vyšší.
Výsledkem prvních čtyř kroků je sada řádků, kde každá skupina po sobě jdoucích (ve vzestupném pořadí audit_date ) řádky s identickými hodnotami suite_id, lease_id, building_id pro stejné lp_id bude jednoznačně odlišena hodnotou vypočítanou jako rozdíl mezi hodnoceními #2 a #3.
V rámci skupiny se každý řádek, počínaje druhým, bude od předchozího lišit pouze hodnotou tenant_trading_name , což je přesně to, co potřebujeme. Řádky tedy seřadíme ještě jednou, přičemž vezmeme v úvahu 'ID skupiny', které jsme právě získali, a poté vrátíme každý řádek s hodnocením 2 nebo vyšším.
Zde je přibližná implementace:
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
Poznámka. To předpokládá, že tabulka auditu zaznamenává pouze skutečné změny, tj. nemohou existovat dva po sobě jdoucí řádky se stejným primárním klíčem, kde všechny čtyři sloupce mají stejné hodnoty.