Tính median trong SQL Server
SQL Server không có hàm MEDIAN(). Gần nhất là PERCENTILE_CONT(), hàm này tìm giá trị tại phân vị thứ n của một tập dữ liệu.
Chúng ta muốn xem median lệch bao nhiêu so với mean theo từng loại sự cố trong tập rollup sự cố. Để làm vậy, ta có thể so sánh hàm AVG() từ bài trước với PERCENTILE_CONT(). Đây là các window function, chúng ta sẽ học chi tiết hơn ở chương 4. Trước mắt, cần biết rằng PERCENTILE_CONT() nhận một tham số là percentile (một số thập phân từ 0 đến 1). Percentile phải nằm trong một nhóm có thứ tự bên trong mệnh đề WITHIN GROUP và OVER một phạm vi nhất định nếu bạn cần partition dữ liệu. Trong phần WITHIN GROUP, chúng ta cần sắp xếp theo cột mà ta muốn lấy phân vị thứ 50.
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
- Điền giá trị còn thiếu cho
PERCENTILE_CONT(). - Bên trong mệnh đề
WITHIN GROUP(), sắp xếp theo số lượng sự cố giảm dần. - Trong mệnh đề
OVER(), partition theoIncidentType(giá trị văn bản thực tế, không phải ID).
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 DISTINCT
it.IncidentType,
AVG(CAST(ir.NumberOfIncidents AS DECIMAL(4,2)))
OVER(PARTITION BY it.IncidentType) AS MeanNumberOfIncidents,
--- Fill in the missing value
PERCENTILE_CONT(___)
-- Inside our group, order by number of incidents DESC
WITHIN GROUP (ORDER BY ir.___ DESC)
-- Do this for each IncidentType value
OVER (PARTITION BY it.___) AS MedianNumberOfIncidents,
COUNT(1) OVER (PARTITION BY it.IncidentType) AS NumberOfRows
FROM dbo.IncidentRollup ir
INNER JOIN dbo.IncidentType it
ON ir.IncidentTypeID = it.IncidentTypeID
INNER JOIN dbo.Calendar c
ON ir.IncidentDate = c.Date
WHERE
c.CalendarQuarter = 2
AND c.CalendarYear = 2020;