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_type
je'Updated'
. -
Seřaďte všechny řádky podle
audit_date
a jejich rozdělení podlelp_id
. -
Seřaďte řádky podle
audit_date
rozdě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.