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

SQL Query untuk mengisi celah yang hilang sepanjang waktu dan mendapatkan nilai non-null terakhir

Saya telah membuat SQL Fiddle solusi ini untuk Anda mainkan.

Pada dasarnya itu membuat Tabel Kerja @Bulan dan kemudian Cross bergabung ini akan bertahun-tahun dalam kumpulan data Anda. Ini menghasilkan daftar lengkap semua bulan untuk semua tahun. Saya kemudian pergi bergabung dengan data Uji yang disediakan dalam contoh Anda (Tabel bernama TEST - lihat SQL biola untuk skema) kembali ke daftar ini untuk memberi saya daftar lengkap dengan Nilai untuk bulan-bulan yang memilikinya. Masalah berikutnya yang harus diatasi adalah menggunakan nilai bulan terakhir jika bulan ini tidak ada. Untuk itu, saya menggunakan sub-kueri yang berkorelasi yaitu bergabung kembali dengan tblValues ​​hanya jika cocok dengan Peringkat maksimum dari suatu baris yang memiliki nilai. Ini kemudian memberikan set hasil yang lengkap!

Jika Anda ingin memfilter menurut tahun\bulan, Anda dapat menambahkan ini ke dalam klausa WHERE tepat sebelum Urutan Terakhir Oleh.

Selamat menikmati!

Skema Pengujian

CREATE TABLE TEST( Month tinyint, Year int, Value int)

INSERT INTO TEST(Month, Year, Value)
VALUES
   (1,2013,100),
   (4,2013,101),
   (8,2013,102),
   (2,2014,103),
   (4,2014,104)

Kueri

DECLARE @Months Table(Month tinyint)
Insert into @Months(Month)Values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12);


With tblValues as (
  select Rank() Over (ORDER BY y.Year, m.Month) as [Rank], 
          m.Month, 
          y.Year, 
          t.Value
  from @Months m
  CROSS JOIN ( Select Distinct Year from Test ) y
  LEFT JOIN Test t on t.Month = m.Month and t.Year = y.Year
  )
Select t.Month, t.Year, COALESCE(t.Value, t1.Value) as Value
from tblValues t
left join tblValues t1 on t1.Rank = (
            Select Max(tmax.Rank)
            From tblValues tmax 
            Where tmax.Rank < t.Rank AND tmax.Value is not null)

Order by t.Year, t.Month



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengubah Properti Server Tertaut di SQL Server

  2. Membandingkan nilai dari 2 tabel dan membuat daftar baris yang berbeda

  3. Permintaan PIVOT dinamis SQL Server?

  4. Menggunakan HashBytes di SQL Server mengembalikan hasil yang berbeda dari DB

  5. Bagaimana cara menghasilkan kueri pembaruan dari kueri dinamis (secara otomatis)?