Menghitung median di SQL Server
Tidak ada fungsi MEDIAN() di SQL Server. Yang paling mendekati adalah PERCENTILE_CONT(), yang mencari nilai pada persentil ke-n di seluruh himpunan data.
Kita ingin mengetahui seberapa jauh median berbeda dari mean berdasarkan jenis insiden dalam himpunan ringkasan insiden kita. Untuk melakukannya, kita dapat membandingkan fungsi AVG() dari latihan sebelumnya dengan PERCENTILE_CONT(). Ini adalah fungsi jendela (window functions), yang akan kita bahas lebih rinci di bab 4. Untuk saat ini, ketahuilah bahwa PERCENTILE_CONT() menerima sebuah parameter, yaitu persentil (bilangan desimal dari 0 hingga 1). Persentil harus berada dalam kelompok berurut di dalam klausa WITHIN GROUP dan OVER rentang tertentu jika Anda perlu melakukan partition pada data. Pada bagian WITHIN GROUP, kita perlu mengurutkan berdasarkan kolom yang persentil ke-50-nya ingin kita ambil.
Latihan ini merupakan bagian dari kursus
Analisis Deret Waktu di SQL Server
Instruksi latihan
- Isi nilai yang hilang untuk
PERCENTILE_CONT(). - Di dalam klausa
WITHIN GROUP(), urutkan berdasarkan jumlah insiden menurun. - Di klausa
OVER(), lakukan partition berdasarkanIncidentType(nilai teks sebenarnya, bukan ID).
Latihan interaktif langsung praktik
Cobalah latihan ini dengan melengkapi kode contoh ini.
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;