sql >> Databasteknik >  >> RDS >> Sqlserver

Fönster glidande medelvärde i sql-server

Ta bort det hårdkodade datumintervallet från din fråga. Skriv utdata (som ditt prov i slutet) till en temporär tabell (jag kallade den #visits nedan).
Testa själv att gå med i temptabellen:

 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

EDIT: Jag hade inte tillräckligt med utrymme i Kommentarer för att svara på din fråga:

Min join är "snålt kartesisk" eftersom den använder ett mellan i join-begränsningen. Varje post i listan går upp mot varannan post, och då vill jag ha de där datumet jag rapporterar är mellan en nedre gräns på (-7) dagar och idag. Varje datadatum är tillgängligt för att lista datum, detta är nyckeln till din fråga. Jag kunde ha skrivit anslutningsvillkoret som

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

Men vad som egentligen hände var att jag testade det som

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

Vilket inte returnerar några poster eftersom syntaxen är "Between LOW and HIGH". Jag facepalmade på 0 poster och bytte argument, det är allt.

Prova följande, se vad jag menar:Detta är den kartesiska anslutningen för bara ett listdatum:

 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'

Jämför detta med det faktiska anslutningsvillkoret

 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'

Se hur listdatum är mellan datadate och dataplus6 i alla poster?




  1. Namnsökning med flera kolumner MySQL

  2. Hur man hämtar bilder från en tabell med andra kolumntexter med PHP

  3. PostgreSQL:Vilken datatyp ska användas för valuta?

  4. InMemory DUBLIKAT Förvirring i Oracle RAC