캘린더 테이블을 사용해 다운샘플링하기
경영진은 주간 보고서를 마음에 들어 했지만, 편의 시설 사용이 있었던 주만이 아니라 2020년의 모든 주를 보고 싶어 했습니다. 이 문제는 캘린더 테이블로 해결할 수 있어요. 캘린더 테이블에는 모든 주가 포함되어 있으므로, 이를 dbo.DaySpaVisit 테이블과 조인해 답을 찾을 수 있습니다.
또한 경영진은 보고서를 보는 사람이 더 잘 이해할 수 있도록 각 달력 주의 첫째 날도 함께 보고 싶어 합니다.
이 연습은 강의의 일부입니다
SQL Server에서의 시계열 분석
연습 안내
- 달력 연도 기준 주를 찾아 포함하세요.
- 각 그룹에서
c.Date의 최솟값을FirstDateOfWeek로 포함하세요. 주 단위로 그룹화하기 때문에 가능합니다. - 캘린더 테이블의 날짜와 각 데이 스파 고객의 방문 날짜를 기준으로
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;