sql >> Database teknologi >  >> RDS >> Sqlserver

Vindues glidende gennemsnit i sql server

Tag det hårdkodede datointerval ud af din forespørgsel. Skriv outputtet (som din prøve i slutningen) til en midlertidig tabel (jeg kaldte den #visits nedenfor).
Prøv selv at deltage i midlertidige tabellen:

Vælg list.dtadmission , AVG(data.nvisits) som Avg , SUM(data.nvisits) som sum , COUNT(data.nvisits) som RollingDayCount , MIN(data.dtadmission) som Verifymindate , MAX(data .dtadmission) som Verifymaxdate fra #visits som liste indre join #visits som data på list.dtadmission mellem data.dtadmission og DATEADD(DD,6,data.dtadmission) gruppe efter list.dtadmission

EDIT: Jeg havde ikke plads nok i kommentarer til at sige dette som svar på dit spørgsmål:

Mit join er "kinda cartesian", fordi det bruger et mellem i join-begrænsningen. Hver post på listen går op imod hver anden post, og så vil jeg have dem, hvor den dato, jeg rapporterer, er mellem en nedre grænse på (-7) dage og i dag. Hver datadato er tilgængelig for en listedato, dette er nøglen til dit spørgsmål. Jeg kunne have skrevet join-betingelsen som

list.dtadmission mellem DATEADD(DD,-6,data.dtadmission) og data.dtadmission 

Men det, der virkelig skete, var, at jeg testede det som

list.dtadmission mellem DATEADD(DD,6,data.dtadmission) og data.dtadmission 

Som ikke returnerer nogen poster, fordi syntaksen er "Mellem LAV og HØJ". Jeg facepalmede på 0 poster og byttede argumenter, det er alt.

Prøv følgende, se hvad jeg mener:Dette er den kartesiske join for kun én listedato:

VÆLG liste.[dtAdmission] som listedato ,data.[dtAdmission] som datadato ,data.nBesøg som datadata ,DATEADD(dd,6,liste.dtadmission) som listeplus6 ,DATEADD(dd,6,data. dtAdmission ) som dataapplus6 fra [sandbox].[dbo].[admAvg] som liste indre join [sandbox].[dbo].[admAvg] som data på 1=1 hvor list.dtAdmission ='5-Jan-2011'

Sammenlign dette med den faktiske sammenføjningstilstand

VÆLG liste.[dtAdmission] som listedato ,data.[dtAdmission] som datadato ,data.nBesøg som datadata ,DATEADD(dd,6,liste.dtadmission) som listeplus6 ,DATEADD(dd,6,data. dtAdmission ) som dataapplus6fra [sandbox].[dbo].[admAvg] som liste indre join [sandbox].[dbo].[admAvg] som data på list.dtadmission mellem data.dtadmission og DATEADD(DD,6,data.dtadmission) )hvor list.dtAdmission ='5-Jan-2011'

Se, hvordan listedatoen er mellem datadate og dataplus6 i alle posterne?




  1. Samme forespørgsel - forskellige eksekveringsplaner

  2. mySQL-eksperter - har brug for hjælp til 'kryds'

  3. Tilføjer manglende datoer fra kalendertabellen

  4. Hvordan justify_hours() virker i PostgreSQL