カレンダーテーブルを使ってダウンサンプリングする
経営陣は週次レポートを気に入っていますが、アメニティの利用があった週だけでなく、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;