Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bantuan kueri saat menggunakan tabel audit

Dengan asumsi tabel audit juga mencatat lease_period kolom kunci utama, dirujuk di sini lp_id untuk mempermudah, Anda dapat mencoba pendekatan berikut:

  1. Temukan semua baris di mana audit_type adalah 'Updated' .

  2. Beri peringkat semua baris menurut audit_date dan mempartisinya dengan lp_id .

  3. Beri peringkat baris menurut audit_date partisi dengan lp_id, suite_id, lease_id, building_id .

  4. Dapatkan perbedaan antara kedua peringkat.

  5. Beri peringkat baris lagi menurut audit_date , mempartisinya sekarang dengan lp_id, suite_id, lease_id, building_id, (ranking_difference) .

  6. 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Memperbaiki "Pernyataan EXECUTE gagal karena klausa WITH RESULT SETS nya ditentukan 1 set hasil ..." di SQL Server

  2. Pemindaian Mundur Indeks SQL Server:Pemahaman dan Penyetelan Kinerja

  3. Bagaimana saya bisa menemukan karakter Unicode/non-ASCII di bidang NTEXT di tabel SQL Server 2005?

  4. SQL Server mengurutkan string yang dipisahkan koma dalam satu kolom

  5. Tambahkan nilai default bidang datetime di SQL Server ke stempel waktu