Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Moyenne mobile de fenêtre dans le serveur sql

Supprimez la plage de dates codée en dur de votre requête. Écrivez la sortie (comme votre exemple à la fin) dans une table temporaire (je l'ai appelée #visits ci-dessous).
Essayez cette auto-jointure à la table temporaire :

 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

MODIF : Je n'avais pas assez de place dans les commentaires pour dire ceci en réponse à votre question :

Ma jointure est "un peu cartésienne" car elle utilise un entre dans la contrainte de jointure. Chaque enregistrement de la liste se compare à tous les autres enregistrements, puis je veux ceux dont la date que je signale se situe entre une limite inférieure de (-7) jours et aujourd'hui. Chaque date de données est disponible pour lister la date, c'est la clé de votre question. J'aurais pu écrire la condition de jointure comme

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

Mais ce qui s'est vraiment passé, c'est que je l'ai testé en tant que

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

Ce qui ne renvoie aucun enregistrement car la syntaxe est "Entre BAS et HAUT". J'ai facepalmé sur 0 enregistrements et j'ai échangé les arguments, c'est tout.

Essayez ce qui suit, voyez ce que je veux dire :il s'agit de la jointure cartésienne pour une seule date de liste :

 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'

Comparez cela à la condition de jointure réelle

 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'

Voyez comment la date de liste est entre datadate et dataplus6 dans tous les enregistrements ?