Próbkowanie w dół przy użyciu tabeli kalendarza
Kierownictwo spodobał się raport tygodniowy, ale chciałoby zobaczyć każdy tydzień 2020 roku – nie tylko te, w których odnotowano korzystanie z udogodnień. Do rozwiązania tego problemu możemy użyć tabeli kalendarza: zawiera ona wszystkie tygodnie, dzięki czemu możemy połączyć ją z tabelą dbo.DaySpaVisit i uzyskać potrzebne dane.
Kierownictwo chciałoby również zobaczyć pierwszy dzień każdego tygodnia kalendarzowego, ponieważ zapewnia to ważny kontekst dla osób czytających raport.
To ćwiczenie jest częścią kursu
Analiza szeregów czasowych w SQL Server
Instrukcje do ćwiczenia
- Znajdź i uwzględnij tydzień roku kalendarzowego.
- Dla każdej grupy uwzględnij minimalną wartość
c.DatejakoFirstDateOfWeek. Działa to poprawnie, ponieważ grupujemy dane według tygodnia. - Połącz tabelę
Calendarz tabeląDaySpaVisitna podstawie daty z tabeli kalendarza i daty wizyty każdego klienta spa.CustomerVisitStartjest typuDATETIME2i zawiera godzinę, dlatego bezpośrednie złączenie uwzględniałoby tylko wizyty rozpoczynające się dokładnie o północy. - Grupuj według tygodnia roku kalendarzowego.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
SELECT
-- Determine the week of the calendar year
c.___,
-- Determine the earliest DATE in this group
-- This is NOT the DayOfWeek column
MIN(c.___) AS FirstDateOfWeek,
ISNULL(SUM(dsv.AmenityUseInMinutes), 0) AS AmenityUseInMinutes,
ISNULL(MAX(dsv.CustomerID), 0) AS HighestCustomerID,
COUNT(dsv.CustomerID) AS NumberOfAttendees
FROM dbo.Calendar c
LEFT OUTER JOIN dbo.DaySpaVisit dsv
-- Connect dbo.Calendar with dbo.DaySpaVisit
-- To join on CustomerVisitStart, we need to turn
-- it into a DATE type
ON c.Date = CAST(dsv.___ AS ___)
WHERE
c.CalendarYear = 2020
GROUP BY
-- When we use aggregation functions like SUM or COUNT,
-- we need to GROUP BY the non-aggregated columns
c.___
ORDER BY
c.CalendarWeekOfYear;