Downsamplen met een kalendertabel
Het management vond het wekelijkse rapport goed, maar ze willen elke week in 2020 zien, niet alleen de weken met gebruik van voorzieningen. We kunnen een kalendertabel gebruiken om dit op te lossen: de kalendertabel bevat alle weken, dus we kunnen die joinen met de tabel dbo.DaySpaVisit om onze antwoorden te vinden.
Het management wil ook de eerste dag van elke kalenderweek zien, omdat dat belangrijke context biedt voor de lezers van het rapport.
Deze oefening maakt deel uit van de cursus
Tijdreeksanalyse in SQL Server
Oefeninstructies
- Zoek en neem de week van het kalenderjaar op.
- Neem de minimumwaarde van
c.Datein elke groep op alsFirstDateOfWeek. Dit werkt omdat we groeperen per week. - Join de tabel
Calendarmet de tabelDaySpaVisitop basis van de datum in de kalendertabel en de bezoekdatum van elke day-spa-klant.CustomerVisitStartis eenDATETIME2met tijd, dus een directe join zou alleen bezoeken opnemen die exact om middernacht beginnen. - Groepeer op de week van het kalenderjaar.
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
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;