Dengan asumsi tabel audit juga mencatat lease_period
kolom kunci utama, dirujuk di sini lp_id
untuk mempermudah, Anda dapat mencoba pendekatan berikut:
-
Temukan semua baris di mana
audit_type
adalah'Updated'
. -
Beri peringkat semua baris menurut
audit_date
dan mempartisinya denganlp_id
. -
Beri peringkat baris menurut
audit_date
partisi denganlp_id, suite_id, lease_id, building_id
. -
Dapatkan perbedaan antara kedua peringkat.
-
Beri peringkat baris lagi menurut
audit_date
, mempartisinya sekarang denganlp_id, suite_id, lease_id, building_id, (ranking_difference)
. -
Keluarkan semua baris dengan nilai peringkat terakhir 2 atau lebih besar.
Empat langkah pertama menghasilkan serangkaian baris di mana setiap grup berturut-turut (dalam urutan menaik dari audit_date
) baris dengan nilai yang identik dari suite_id, lease_id, building_id
untuk lp_id
yang sama akan dibedakan secara unik dengan nilai yang dihitung sebagai perbedaan antara peringkat #2 .
Dalam grup, setiap baris, mulai dari yang kedua, akan berbeda dari yang sebelumnya hanya dalam nilai tenant_trading_name
, yang hanya apa yang kita butuhkan. Jadi, kami membuat peringkat baris sekali lagi, dengan mempertimbangkan 'ID grup' yang baru saja kami peroleh, lalu mengembalikan setiap baris dengan peringkat 2 atau lebih tinggi.
Berikut ini perkiraan penerapannya:
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
Catatan. Ini mengasumsikan bahwa tabel audit hanya mencatat perubahan nyata, yaitu tidak boleh ada dua baris berurutan dengan kunci utama yang sama di mana keempat kolom memiliki nilai yang sama.