Reduza a amostragem usando uma tabela de calendário
A gerência gostou do relatório semanal, mas quer ver todas as semanas de 2020, não apenas as semanas com uso de comodidades. Podemos usar uma tabela de calendário para resolver isso: a tabela de calendário inclui todas as semanas, então podemos fazer um join com a tabela dbo.DaySpaVisit para encontrar nossas respostas.
A gerência também quer ver o primeiro dia de cada semana do calendário, pois isso dá um contexto importante para quem lê o relatório.
Este exercício faz parte do curso
Análise de Séries Temporais no SQL Server
Instruções do exercício
- Encontre e inclua a semana do ano do calendário.
- Inclua o valor mínimo de
c.Dateem cada grupo comoFirstDateOfWeek. Isso funciona porque estamos agrupando por semana. - Faça um join da tabela
Calendarcom a tabelaDaySpaVisitcom base na data da tabela de calendário e na data da visita de cada cliente do spa.CustomerVisitStarté umDATETIME2que inclui horário, então um join direto só incluiria visitas que começaram exatamente à meia-noite. - Agrupe pela semana do ano do calendário.
Exercício interativo prático
Experimente este exercício completando este código de exemplo.
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;