sql >> Database >  >> RDS >> Sqlserver

Venster voortschrijdend gemiddelde in sql-server

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?




  1. MySQLdb in Python:kan geen verbinding maken met MySQL-server op 'localhost'

  2. SQL-query's voor berichten met threads

  3. ORA-00936:ontbrekende uitdrukking orakel

  4. Wat is het verschil tussen char, nchar, varchar en nvarchar in SQL Server?