sql >> Databáze >  >> RDS >> Sqlserver

Klouzavý průměr okna na serveru SQL

Odstraňte pevně zakódované časové období z dotazu. Zapište výstup (jako váš vzorek na konci) do dočasné tabulky (nazval jsem to níže #visits).
Vyzkoušejte toto vlastní připojení k dočasné tabulce:

 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

UPRAVIT: V komentářích jsem neměl dost místa, abych odpověděl na vaši otázku takto:

Moje spojení je „tak trochu karteziánské“, protože používá mezi v omezení spojení. Každý záznam v seznamu se porovnává s každým jiným záznamem a pak chci ty, kde datum, které hlásím, je mezi spodní hranicí (-7) dnů a dneškem. Každé datum je k dispozici k datu seznamu, to je klíč k vaší otázce. Podmínku spojení jsem mohl napsat jako

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

Ale ve skutečnosti se stalo to, že jsem to otestoval jako

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

Což nevrací žádné záznamy, protože syntaxe je "Mezi NÍZKOU a VYSOKOU". Facepalmoval jsem na 0 záznamech a vyměnil argumenty, to je vše.

Zkuste následující a zjistěte, co tím myslím:Toto je kartézské spojení pouze pro jeden seznam:

 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'

Porovnejte to se skutečnou podmínkou připojení

 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'

Podívejte se, jak je datum seznamu mezi datadate a dataplus6 ve všech záznamech?




  1. Přístup pouze pro čtení k obsahu uložené procedury

  2. Vyberte neprázdné sloupce pomocí SQL Server

  3. Vrátí počet řádků ovlivněných příkazem SQL UPDATE v Javě

  4. vytvořte spouštěč pro získání IP adresy klienta do sloupce v MySQL