Sous-échantillonner à l'aide d'une table calendrier
La direction a aimé le rapport hebdomadaire, mais elle souhaite voir toutes les semaines de 2020, pas seulement celles où il y a eu utilisation d'un service. Nous pouvons utiliser une table calendrier pour régler ce problème : la table calendrier inclut toutes les semaines, nous pouvons donc la joindre à la table dbo.DaySpaVisit pour obtenir nos résultats.
La direction aimerait aussi voir le premier jour de chaque semaine civile, car cela donne un contexte important aux personnes qui consultent le rapport.
Cette activité fait partie du cours
Analyse de séries chronologiques dans SQL Server
Instructions de l’exercice
- Repérez et incluez la semaine de l'année civile.
- Incluez la valeur minimale de
c.Datedans chaque groupe sous le nomFirstDateOfWeek. Cela fonctionne parce que nous regroupons par semaine. - Joignez la table
Calendarà la tableDaySpaVisiten fonction de la date de la table calendrier et de la date de visite de chaque client du spa de jour.CustomerVisitStartest unDATETIME2qui inclut l'heure, donc une jointure directe n'inclurait que les visites commençant exactement à minuit. - Regroupez par la semaine de l'année civile.
Exercice interactif pratique
Essayez cet exercice en complétant ce code d’exemple.
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;