Haal het hardgecodeerde datumbereik uit uw zoekopdracht. Schrijf de uitvoer (zoals je voorbeeld aan het einde) naar een tijdelijke tabel (ik noemde het hieronder #bezoeken).
Probeer deze zelf-join naar de tijdelijke tabel:
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
BEWERKEN: Ik had niet genoeg ruimte in Reacties om dit te zeggen als antwoord op je vraag:
Mijn join is "soort cartesiaans" omdat het een tussen gebruikt in de join-beperking. Elk record in de lijst gaat het op tegen elk ander record, en dan wil ik degene waarvan de datum die ik rapporteer tussen een ondergrens van (-7) dagen en vandaag ligt. Elke datadatum is beschikbaar om de datum te vermelden, dit is de sleutel tot uw vraag. Ik had de deelnamevoorwaarde kunnen schrijven als
list.dtadmission between DATEADD(DD,-6,data.dtadmission) and data.dtadmission
Maar wat er echt gebeurde, was dat ik het testte als
list.dtadmission between DATEADD(DD,6,data.dtadmission) and data.dtadmission
Wat geen records retourneert omdat de syntaxis "Tussen LAAG en HOOG" is. Ik facepalmde op 0 records en verwisselde de argumenten, dat is alles.
Probeer het volgende, kijk wat ik bedoel:Dit is de cartesiaanse deelname voor slechts één lijstdatum:
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'
Vergelijk dit met de daadwerkelijke deelnamevoorwaarde
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'
Zien hoe de lijstdatum in alle records tussen datadate en dataplus6 ligt?