ComeçarComece de graça

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

Ver curso

Instruções do exercício

  • Encontre e inclua a semana do ano do calendário.
  • Inclua o valor mínimo de c.Date em cada grupo como FirstDateOfWeek. Isso funciona porque estamos agrupando por semana.
  • Faça um join da tabela Calendar com a tabela DaySpaVisit com base na data da tabela de calendário e na data da visita de cada cliente do spa. CustomerVisitStart é um DATETIME2 que 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;
Editar e executar o código