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?