sql >> Base de Datos >  >> RDS >> Sqlserver

Promedio móvil de ventana en el servidor sql

Elimine el rango de fechas codificado de su consulta. Escriba el resultado (como su muestra al final) en una tabla temporal (lo llamé #visits a continuación).
Pruebe esto mismo únase a la tabla temporal:

 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

EDITAR: No tuve suficiente espacio en Comentarios para decir esto en respuesta a su pregunta:

Mi unión es "un poco cartesiana" porque usa un entre en la restricción de unión. Cada registro en la lista se compara con todos los demás registros, y luego quiero aquellos en los que la fecha que informo está entre un límite inferior de (-7) días y hoy. Cada fecha de datos está disponible para listar la fecha, esta es la clave de su pregunta. Podría haber escrito la condición de unión como

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

Pero lo que realmente sucedió fue que lo probé como

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

Lo que no devuelve registros porque la sintaxis es "Entre BAJO y ALTO". Puse mi facepalm en 0 registros e intercambié los argumentos, eso es todo.

Pruebe lo siguiente, vea lo que quiero decir:esta es la unión cartesiana para solo una fecha de lista:

 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'

Compare esto con la condición de unión real

 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'

¿Ves cómo la fecha de la lista está entre datadate y dataplus6 en todos los registros?