Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Media mobile della finestra nel server sql

Elimina l'intervallo di date codificato dalla tua query. Scrivi l'output (come il tuo esempio alla fine) in una tabella temporanea (l'ho chiamata #visits di seguito).
Prova questo self join alla tabella temporanea:

 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

MODIFICA: Non avevo abbastanza spazio nei commenti per rispondere alla tua domanda:

Il mio join è "un po' cartesiano" perché utilizza un tra nel vincolo di join. Ogni record nell'elenco sta andando contro ogni altro record, quindi voglio quelli in cui la data che riporto è compresa tra un limite inferiore di (-7) giorni e oggi. Ogni data di dati è disponibile per elencare la data, questa è la chiave della tua domanda. Avrei potuto scrivere la condizione di unione come

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

Ma quello che è successo veramente è che l'ho testato come

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

Che non restituisce alcun record perché la sintassi è "Tra BASSO e ALTO". Ho fatto il facepalm su 0 record e ho scambiato gli argomenti, tutto qui.

Prova quanto segue, vedi cosa intendo:questo è il join cartesiano per un solo listdate:

 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'

Confrontalo con la condizione di unione effettiva

 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'

Vedi come si trova la data dell'elenco tra datadate e dataplus6 in tutti i record?