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 ?