ПочатиПочніть безкоштовно

Обчислення медіани в SQL Server

У SQL Server немає функції MEDIAN(). Найближчий еквівалент — PERCENTILE_CONT(), яка знаходить значення на n-му процентилі в наборі даних.

Ми хочемо зʼясувати, наскільки медіана відрізняється від середнього для кожного типу інциденту в нашому підсумковому наборі інцидентів. Для цього можна порівняти AVG() з попередньої вправи з PERCENTILE_CONT(). Це віконні функції, які ми детальніше розглянемо в розділі 4. Поки що важливо знати, що PERCENTILE_CONT() приймає параметр — процентиль (десяткове число в діапазоні від 0 до 1). Процентиль має обчислюватися в упорядкованій групі в межах клаузи WITHIN GROUP і OVER певного діапазону, якщо потрібне розбиття даних на розділи. У секції WITHIN GROUP потрібно впорядкувати за стовпцем, для якого ми шукаємо 50-й процентиль.

Ця вправа є частиною курсу

Аналіз часових рядів у SQL Server

Переглянути курс

Інструкції до вправи

  • Заповніть пропущене значення для PERCENTILE_CONT().
  • Усередині клаузи WITHIN GROUP() виконайте впорядкування за кількістю інцидентів за спаданням.
  • У клаузі OVER() виконайте розбиття на розділи за IncidentType (фактичним текстовим значенням, а не ідентифікатором).

Інтерактивна практична вправа

Спробуйте виконати цю вправу, доповнивши цей зразок коду.

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;
Редагувати та запускати код