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

temukan entri yang hilang untuk hari kerja dan isi baris dengan nilai dari tanggal terdekat

Untuk jenis kueri ini, Anda memperoleh manfaat kinerja yang signifikan dari membuat tabel kalender yang berisi setiap tanggal yang perlu Anda uji. (Jika Anda familiar dengan istilah "tabel dimensi", ini hanyalah salah satu tabel untuk menghitung setiap tanggal yang diinginkan.)

Selain itu, kueri secara keseluruhan dapat menjadi jauh lebih sederhana.

SELECT
   cal.calendar_date   AS data_date,
   CASE WHEN prev_data.gap <= next_data.gap
        THEN prev_data.data_value
        ELSE COALESCE(next_data.data_value, prev_data.data_value)
   END
       AS data_value
FROM
    calendar   AS cal
OUTER APPLY
(
    SELECT TOP(1)
        data_date,
        data_value,
        DATEDIFF(DAY, data_date, cal.calendar_date)   AS gap
    FROM
        data_table
    WHERE
        data_date <= cal.calendar_date
    ORDER BY
        data_date DESC
)
   prev_data
OUTER APPLY
(
    SELECT TOP(1)
        data_date,
        data_value,
        DATEDIFF(DAY, cal.calendar_date, data_date)   AS gap
    FROM
        data_table
    WHERE
        data_date >  cal.calendar_date
    ORDER BY
        data_date ASC
)
   next_data
WHERE
   cal.calendar_date BETWEEN '2015-01-01' AND '2015-12-31'
;

EDIT Balas komentar Anda dengan persyaratan berbeda

Untuk selalu mendapatkan "nilai di atas" lebih mudah, dan memasukkan nilai-nilai itu ke dalam tabel cukup mudah...

INSERT INTO
    data_table
SELECT
   cal.calendar_date,
   prev_data.data_value
FROM
    calendar   AS cal
CROSS APPLY
(
    SELECT TOP(1)
        data_date,
        data_value
    FROM
        data_table
    WHERE
        data_date <= cal.calendar_date
    ORDER BY
        data_date DESC
)
   prev_data
WHERE
       cal.calendar_date BETWEEN '2015-01-01' AND '2015-12-31'
   AND cal.calendar_date <> prev_data.data_date
;

Catatan: Anda dapat menambahkan WHERE prev_data.gap > 0 ke kueri yang lebih besar di atas untuk hanya mendapatkan tanggal yang belum memiliki data.



  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 mendapatkan nomor minggu bulan dari tanggal di sql server 2008

  2. 6 Cara untuk Memeriksa apakah Tabel Ada di SQL Server (Contoh T-SQL)

  3. Fungsi SUM Tidak Ditambahkan dengan Benar

  4. SQL:Pilih Nilai Berbeda Secara Berurutan Terbaru dengan Pengelompokan

  5. Ubah float menjadi varchar di SQL Server tanpa notasi ilmiah