Bắt đầu ngayBắt đầu miễn phí

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

Xem khóa học

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.Date trong 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 Calendar với bảng DaySpaVisit dựa trên ngày trong bảng lịch và ngày khách đến spa. CustomerVisitStart là kiểu DATETIME2 có 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;
Chỉnh sửa và Chạy Mã