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?