Ако приемем, че таблицата за проверка регистрира и lease_period
колона с първичен ключ, посочена тук lp_id
за простота можете да опитате следния подход:
-
Намерете всички редове, където
audit_type
е'Updated'
. -
Класирайте всички редове по
audit_date
и разделянето им чрезlp_id
. -
Класирайте редовете по
audit_date
разделяне поlp_id, suite_id, lease_id, building_id
. -
Получете разликата между двете класации.
-
Класирайте отново редовете по
audit_date
, разделяйки ги сега поlp_id, suite_id, lease_id, building_id, (ranking_difference)
. -
Изведете всички редове, където последната класирана стойност е 2 или по-голяма.
Първите четири стъпки водят до набор от редове, където всяка група от последователни (във възходящ ред на audit_date
) редове с еднакви стойности на suite_id, lease_id, building_id
за същия lp_id
ще се отличава по уникален начин със стойност, изчислена като разлика между класирането #2 и #3.
В рамките на групата всеки ред, започвайки от втория, ще се различава от предходния само по стойността на tenant_trading_name
, което е точно това, от което се нуждаем. И така, ние класираме редовете още веднъж, като вземаме предвид „ID на групата“, който току-що получихме, след което връщаме всеки ред с класиране 2 или по-високо.
Ето едно приблизително внедряване:
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
Забележка. Това предполага, че таблицата за проверка регистрира само реални промени, т.е. не може да има два последователни реда с един и същ първичен ключ, където и четирите колони имат идентични стойности.