Ако приемем, че таблицата за проверка регистрира и 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
Забележка. Това предполага, че таблицата за проверка регистрира само реални промени, т.е. не може да има два последователни реда с един и същ първичен ключ, където и четирите колони имат идентични стойности.