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_typeadalah'Updated'. -
Beri peringkat semua baris menurut
audit_datedan mempartisinya denganlp_id. -
Beri peringkat baris menurut
audit_datepartisi 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.