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

Bagaimana cara mengisi celah?

Anda memiliki 2 masalah yang Anda coba selesaikan. Masalah pertama adalah bagaimana mengisi kesenjangan. Masalah kedua adalah mengisi bidang Hitungan untuk catatan yang hilang itu.

Masalah 1:Ini dapat diselesaikan dengan menggunakan Dates Lookup table atau dengan membuat recursive common table expression . Saya akan merekomendasikan membuat tabel Pencarian Tanggal untuk ini jika itu adalah opsi. Jika Anda tidak dapat membuat tabel seperti itu, maka Anda akan membutuhkan sesuatu seperti ini.

WITH CTE AS (
  SELECT MAX(dt) maxdate, MIN(dt) mindate
  FROM yourtable
  ),
RecursiveCTE AS (
  SELECT mindate dtfield
  FROM CTE
  UNION ALL
  SELECT DATEADD(day, 1, dtfield)
  FROM RecursiveCTE R 
    JOIN CTE T
      ON R.dtfield < T.maxdate
  )

Itu akan membuat Anda daftar tanggal yang dimulai dengan MIN tanggal di tabel Anda dan diakhiri dengan MAX .

Masalah 2:Di sinilah correlated subquery akan berguna (sebanyak saya biasanya menjauh dari mereka) untuk mendapatkan cnt terakhir dari tabel asli Anda:

SELECT r.dtfield, 
   (SELECT TOP 1 cnt
    FROM yourtable 
    WHERE dt <= r.dtfield 
    ORDER BY dt DESC) cnt
FROM RecursiveCTE r


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server TAMPILKAN TABEL Setara

  2. Konversi SQL dari varchar ke uniqueidentifier gagal dilihat

  3. Perbarui tabel database dari satu tabel database SQL Server ke yang lain?

  4. SQL Server 2005 memulihkan satu skema saja

  5. Mengapa RAND() tidak menghasilkan angka acak?