Aan de slagGa gratis aan de slag

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

Cursus bekijken

Oefeninstructies

  • Zoek en neem de week van het kalenderjaar op.
  • Neem de minimumwaarde van c.Date in elke groep op als FirstDateOfWeek. Dit werkt omdat we groeperen per week.
  • Join de tabel Calendar met de tabel DaySpaVisit op basis van de datum in de kalendertabel en de bezoekdatum van elke day-spa-klant. CustomerVisitStart is een DATETIME2 met 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;
Code bewerken en uitvoeren