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

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 GROUPOVER 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

Xem khóa học

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 theo IncidentType (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;
Chỉnh sửa và Chạy Mã