始める無料で始める

カレンダーテーブルを使ってダウンサンプリングする

経営陣は週次レポートを気に入っていますが、アメニティの利用があった週だけでなく、2020年のすべての週を見たいとのことです。これにはカレンダーテーブルを使えます。カレンダーテーブルにはすべての週が含まれているため、dbo.DaySpaVisit テーブルと結合して集計できます。

また、各カレンダー週の初日も表示してほしいとの要望があります。これはレポート閲覧者にとって重要なコンテキストになるためです。

この演習はコースの一部です

SQL Serverで学ぶ時系列分析

コースを見る

演習の手順

  • 年内の週番号を取得して含めてください。
  • 各グループの c.Date の最小値を FirstDateOfWeek として含めてください。週でグループ化するため、これで週の初日が得られます。
  • カレンダーテーブルの Date と、デイスパ顧客の来店日で Calendar テーブルと DaySpaVisit テーブルを結合してください。CustomerVisitStart は時刻を含む DATETIME2 のため、直接結合するとちょうど真夜中に開始した訪問しか結合されません。
  • 年内の週番号でグループ化してください。

実践的なインタラクティブ演習

このサンプルコードを完成させて、この演習に挑戦してみましょう。

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;
コードを編集して実行