Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Średnia ruchoma okna w serwerze sql

Usuń zakodowany na stałe zakres dat z zapytania. Zapisz dane wyjściowe (takie jak twoja próbka na końcu) do tabeli tymczasowej (nazwę to #visits poniżej).
Spróbuj tego samodzielnego dołączenia do tabeli tymczasowej:

 Wybierz list.dtadmission , AVG(data.nvisits) jako Avg , SUM(data.nvisits) jako sum , COUNT(data.nvisits) jako RollingDayCount , MIN(data.dtadmission) jako Verifymindate , MAX(data .dtadmission) as Verifymaxdate z #visits jako list internal join #visits jako dane na list.dtadmission pomiędzy data.dtadmission i DATEADD(DD,6,data.dtadmission) grupuj przez list.dtadmission 

EDYTUJ: Nie mam wystarczająco dużo miejsca w komentarzach, aby odpowiedzieć na Twoje pytanie:

Moje łączenie jest „trochę kartezjańskie”, ponieważ używa pośredniego w ograniczeniu złączenia. Każdy rekord na liście jest zgodny z każdym innym rekordem, a następnie chcę te, w których zgłaszana przeze mnie data mieści się między dolnym ograniczeniem (-7) dni a dniem dzisiejszym. Każda data danych jest dostępna dla daty listy, to jest klucz do twojego pytania. Mogłem napisać warunek dołączenia jako

list.dtadmission między DATEADD(DD,-6,data.dtadmission) a data.dtadmission 

Ale tak naprawdę to przetestowałem jako

list.dtadmission między DATEADD(DD,6,data.dtadmission) a data.dtadmission 

Co nie zwraca żadnych rekordów, ponieważ składnia to „Między NISKIM i WYSOKIM”. Nagrałem facepalm na 0 rekordach i zamieniłem argumenty, to wszystko.

Spróbuj wykonać następujące czynności, zobacz, co mam na myśli:To jest sprzężenie kartezjańskie tylko dla jednej daty listy:

SELECT lista.[dtAdmission] as listdate ,data.[dtAdmission] as datadata ,data.nOdwiedza jako datadata ,DATEADD(dd,6,list.dtaadmission) as listplus6 ,DATEADD(dd,6,data. dtAdmission ) jako datapplus6 z [sandbox].[dbo].[admAvg] jako lista złączenia wewnętrznego [sandbox].[dbo].[admAvg] jako dane na 1=1 gdzie list.dtAdmission ='5-sty-2011'

Porównaj to z rzeczywistym warunkiem dołączenia

SELECT lista.[dtAdmission] as listdate ,data.[dtAdmission] as datadata ,data.nOdwiedza jako datadata ,DATEADD(dd,6,list.dtaadmission) as listplus6 ,DATEADD(dd,6,data. dtAdmission ) jako datapplus6from [sandbox].[dbo].[admAvg] jako lista złączenia wewnętrznego [sandbox].[dbo].[admAvg] jako dane na list.dtadmission między data.dtadmission i DATEADD(DD,6,data.dtadmission )gdzie list.dtAdmission =„5 stycznia 2011”

Widzisz, jak data na liście znajduje się między datadate a dataplus6 we wszystkich rekordach?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak filtrować obiekty w SQL Server Management Studio (SSMS) — samouczek SQL Server / TSQL, część 19

  2. Porady Brenta Ozara i Pinala Dave dotyczące wydajności SQL Server

  3. Wstaw wartość ciągu szesnastkowego do pola obrazu serwera sql dołącza dodatkowe 0

  4. Klucz obcy do wielu tabel

  5. Nie można połączyć się z bazą danych z pliku