Понижение частоты дискретизации с помощью таблицы-календаря
Руководству понравился еженедельный отчёт, однако оно хотело видеть все недели 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;