Зменшення частоти вибірки за допомогою календарної таблиці
Керівництву сподобався щотижневий звіт, але вони хочуть бачити всі тижні 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;