Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Пълзяща средна стойност на прозореца в sql сървър

Извадете твърдо кодирания период от време от заявката си. Запишете изхода (като вашия пример в края) във временна таблица (нарекох го #visits по-долу).
Опитайте това самостоятелно присъединяване към временната таблица:

 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

РЕДАКТИРАНЕ: Нямах достатъчно място в коментарите, за да кажа това в отговор на въпроса ви:

Моето съединение е "донякъде декартово", защото използва между в ограничението за свързване. Всеки запис в списъка се изравнява с всеки друг запис и тогава искам тези, при които датата, която отчитам, е между долната граница от (-7) дни и днес. Всяка дата с данни е достъпна за списък с дати, това е ключът към вашия въпрос. Можех да напиша условието за присъединяване като

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

Но това, което наистина се случи, беше, че го тествах като

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

Което не връща записи, защото синтаксисът е „Между НИСКО и ВИСОКО“. Прегледах с facepalm 0 записа и размених аргументите, това е всичко.

Опитайте следното, вижте какво имам предвид:Това е декартово съединение само за една списъчна дата:

 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'

Сравнете това с действителното условие за присъединяване

 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'

Вижте как датата на списъка е между datadate и dataplus6 във всички записи?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Сума от минути между множество периоди от време

  2. DAY() Примери в SQL Server (T-SQL)

  3. Node.js MSSQL tedius ConnectionError:Неуспешно свързване към localhost:1433 - свържете ECONNREFUSED

  4. DATEADD() Примери в SQL Server

  5. Разлика между локални и глобални временни таблици в SQL Server