Предполагая, что таблица аудита также регистрирует столбец первичного ключа lease_period
, на который здесь ссылаются lp_id
для простоты, вы можете попробовать следующий подход:
Найти все строки, где audit_type
is '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.
Внутри группы каждый ряд, начиная со второго, будет отличаться от pтолько в значении tenant_trading_name
, которое как раз то, что нам нужно.Итак, мы снова ранжируем строки, принимая во внимание только что полученный «идентификатор группы», а затем возвращаем каждую строку с рейтингом 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
Примечание.Это предполагает, что таблица аудита регистрирует только реальные изменения, т. Е. Не может быть двух последовательных строк с одинаковым первичным ключом, где все четыре столбца имеют одинаковые значения.