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

Rata-rata pergerakan jendela di server sql

Keluarkan rentang tanggal hardcode dari kueri Anda. Tulis output (seperti contoh Anda di akhir) ke tabel temp (saya menyebutnya #kunjungan di bawah).
Coba gabungkan sendiri ke tabel temp:

 Select list.dtadmission
   , AVG(data.nvisits) as Avg
   , SUM(data.nvisits) as sum
   , COUNT(data.nvisits) as RollingDayCount
   , MIN(data.dtadmission) as Verifymindate
   , MAX(data.dtadmission)   as Verifymaxdate
 from  #visits as list 
 inner join #visits as data  
 on list.dtadmission between data.dtadmission and DATEADD(DD,6,data.dtadmission) group by list.dtadmission

EDIT: Saya tidak memiliki cukup ruang di Komentar untuk mengatakan ini sebagai tanggapan atas pertanyaan Anda:

Gabung saya adalah "agak cartesian" karena menggunakan batasan antara dalam gabung. Setiap catatan dalam daftar akan naik melawan setiap catatan lainnya, dan kemudian saya ingin yang tanggal saya laporkan berada di antara batas bawah (-7) hari dan hari ini. Setiap tanggal data tersedia untuk mencantumkan tanggal, ini adalah kunci pertanyaan Anda. Saya bisa menulis kondisi bergabung sebagai

list.dtadmission between DATEADD(DD,-6,data.dtadmission) and data.dtadmission

Tapi yang sebenarnya terjadi adalah saya mengujinya sebagai

list.dtadmission between DATEADD(DD,6,data.dtadmission) and data.dtadmission

Yang tidak mengembalikan catatan karena sintaksnya adalah "Antara RENDAH dan TINGGI". Saya melakukan facepalmed pada 0 catatan dan menukar argumen, itu saja.

Coba yang berikut ini, lihat apa yang saya maksud:Ini adalah cartesian join hanya untuk satu tanggal daftar:

 SELECT 
 list.[dtAdmission] as listdate
 ,data.[dtAdmission] as datadate
 ,data.nVisits as datadata
 ,DATEADD(dd,6,list.dtadmission) as listplus6 
 ,DATEADD(dd,6,data.dtAdmission ) as datapplus6 
 from  [sandbox].[dbo].[admAvg] as list inner join [sandbox].[dbo].[admAvg] as data    
 on 
 1=1
 where list.dtAdmission = '5-Jan-2011'

Bandingkan ini dengan kondisi join yang sebenarnya

 SELECT 
      list.[dtAdmission] as listdate
      ,data.[dtAdmission] as datadate
      ,data.nVisits as datadata
      ,DATEADD(dd,6,list.dtadmission) as listplus6 
      ,DATEADD(dd,6,data.dtAdmission ) as datapplus6
from  [sandbox].[dbo].[admAvg] as list   inner join [sandbox].[dbo].[admAvg] as data    
on 
list.dtadmission between data.dtadmission and DATEADD(DD,6,data.dtadmission)
where list.dtAdmission = '5-Jan-2011'

Lihat bagaimana daftar tanggal antara datadate dan dataplus6 di semua catatan?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan dalam SQL Server saat mengimpor file CSV meskipun varchar(MAX) digunakan untuk setiap kolom

  2. Bagaimana cara menambahkan Batasan Default ke Kolom yang ada di Tabel SQL Server - Tutorial SQL Server / TSQL Bagian 91

  3. Gunakan TYPEPROPERTY() untuk Mengembalikan Informasi tentang Tipe Data di SQL Server

  4. Pilih pernyataan untuk mengembalikan induk dan anak tak terbatas

  5. Alias ​​referensi (dihitung dalam SELECT) dalam klausa WHERE