Reducerea eșantionării folosind un tabel calendar
Conducerii i-a plăcut raportul săptămânal, dar dorește să vadă fiecare săptămână din 2020, nu doar săptămânile în care au fost utilizate facilitățile. Putem rezolva această problemă cu ajutorul unui tabel calendar: acesta include toate săptămânile, astfel încât îl putem uni cu tabelul dbo.DaySpaVisit pentru a găsi răspunsurile dorite.
Conducerea ar dori, de asemenea, să vadă prima zi a fiecărei săptămâni calendaristice, deoarece aceasta oferă un context important pentru cei care consultă raportul.
Acest exercițiu face parte din cursul
Analiza seriilor de timp în SQL Server
Instrucțiuni pentru exercițiu
- Găsește și include săptămâna din anul calendaristic.
- Include valoarea minimă a
c.Datedin fiecare grup sub denumireaFirstDateOfWeek. Aceasta funcționează deoarece grupăm datele pe săptămâni. - Unește tabelul
Calendarcu tabelulDaySpaVisitpe baza datei din tabelul calendar și a datei vizitei fiecărui client al centrului spa.CustomerVisitStarteste de tipDATETIME2, care include și ora, astfel că o unire directă ar include doar vizitele care încep exact la miezul nopții. - Grupează după săptămâna din anul calendaristic.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
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;