Tabel yang saya kerjakan memiliki tiga komponen:
- Sebuah
ID
kolom (primary key pada tabel lain) - Beberapa kolom data
- Tanggal valid
from
/to
kolom.
Nilai:
ID Data From To
1 a 2015-01-01 2015-01-05
1 a 2015-01-06 2015-01-10
1 b 2015-01-11 2015-01-15
1 a 2015-01-16 2015-01-20
2 c 2015-01-01 2015-01-05
2 c 2015-01-06 2015-01-10
Tabel diperbarui dengan mengambil "snapshot" dari sumber data lain pada beberapa interval dan menetapkan tanggal validitas ke catatan. Masalahnya adalah snapshot ini membuat entri duplikat untuk catatan (dengan tanggal validitas berbeda) yang tidak berubah sama sekali selama interval itu.
Saya ingin mengurangi ukuran tabel dengan mencari baris dengan tanggal berurutan dan dengan menggabungkan mereka dan menugaskan mereka periode validitas tunggal. Sebagai contoh:
ID Data From To
1 a 2015-01-01 2015-01-10
1 b 2015-01-11 2015-01-15
1 a 2015-01-16 2015-01-20
2 c 2015-01-01 2015-01-10
Logika yang saya miliki saat ini adalah:
- Pilih dan urutkan semua baris berdasarkan ID, bidang data, dan bidang 'valid dari' (sehingga mereka berada dalam kelompok baris berturut-turut).
- Gunakan kursor untuk membandingkan baris yang berdekatan untuk kesamaan.
- Jika sama, maka gabungkan baris dan ubah periode validitas untuk memasukkan kedua baris tersebut.
Saya mengerti bahwa kursor sangat tidak efisien (saya punya dataset besar), jadi saya mencari pendekatan lain.
CREATE TABLE
pernyataan dalam pertanyaan.Jawaban:
Jika ini hanya tabel rentang belakang-ke-belakang saja, kasing Anda dapat diperlakukan sebagai masalah klasik "celah dan pulau", di mana Anda hanya perlu mengisolasi pulau dengan rentang berurutan dan kemudian "mengembunkan" dengan mengambil minimum
[from]
dan maksimum[to]
per pulau.Ada metode yang mapan untuk memecahkan masalah ini menggunakan dua panggilan ROW_NUMBER:
Kueri ini akan berfungsi dalam versi serendah SQL Server 2005.
sumber
Saya bisa menulis kueri untuk mengatasi masalah ini. Ini menggunakan beberapa gabungan dan loop sementara untuk menggabungkan catatan. Kode ini kompatibel dengan SQL Server 2008 R2.
sumber
Hanya untuk kasus di mana Anda memiliki rentang tanggal yang tidak berdekatan yang, meskipun berturut-turut, harus tetap terpisah, saya datang dengan solusi ini:
Lihat di SQL Fiddle
sumber
Saya menulis kueri yang sepertinya berfungsi. Menggunakan Common Table Expressions, pernyataan MERGE dan fungsi Analytic. Namun itu hanya kompatibel dengan SQL server 2012+. Anda dapat menemukan intinya di sini: MergeRecordsByValidityDate.sql
sumber