Lấy mẫu thưa (downsample) bằng bảng lịch
Ban quản lý thích báo cáo theo tuần nhưng muốn thấy mọi tuần trong năm 2020, không chỉ các tuần có sử dụng tiện ích. Chúng ta có thể dùng một bảng lịch để giải quyết vấn đề này: bảng lịch bao gồm tất cả các tuần, nên ta có thể JOIN với bảng dbo.DaySpaVisit để tìm câu trả lời.
Ban quản lý cũng muốn thấy ngày đầu tiên của mỗi tuần theo lịch, vì điều đó cung cấp ngữ cảnh quan trọng cho người xem báo cáo.
Bài tập này là một phần của khóa học
Phân tích chuỗi thời gian trong SQL Server
Hướng dẫn bài tập
- Tìm và đưa vào số tuần trong năm theo lịch.
- Lấy giá trị nhỏ nhất của
c.Datetrong mỗi nhóm và đặt tên làFirstDateOfWeek. Điều này hợp lý vì ta đang nhóm theo tuần. - JOIN bảng
Calendarvới bảngDaySpaVisitdựa trên ngày trong bảng lịch và ngày khách đến spa.CustomerVisitStartlà kiểuDATETIME2có bao gồm thời gian, nên nếu JOIN trực tiếp thì chỉ bao gồm những lượt bắt đầu đúng vào nửa đêm. - Nhóm theo số tuần trong năm theo lịch.
Bài tập tương tác thực hành trực tiếp
Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.
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;