Menghitung Median dan Percentile di SQL (2026)
TL;DR
Buat hitung median di SQL, pakai PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kolom). Median itu percentile ke-50. Fungsi ini juga bisa hitung percentile lain kayak P90 atau P25. PostgreSQL, SQL Server, dan BigQuery dukung, tapi MySQL butuh cara manual pakai window function.
Buat hitung median di SQL, pakai PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kolom). Median itu sebenernya percentile ke-50, jadi satu fungsi ini ngecover keduanya.
Kenapa ga pakai AVG aja? Karena rata-rata gampang ketarik nilai ekstrem. Satu transaksi Rp10 juta bisa bikin rata-rata naik, padahal mayoritas transaksi kecil. Median lebih tahan sama pencilan.
Di artikel ini kamu bakal belajar cara hitung median dan percentile, bedain CONT sama DISC, hitung per grup, sampai trik buat MySQL yang belum punya fungsinya.
Apa itu median dan percentile?
Median adalah nilai tengah dari data yang udah diurutkan, jadi setengah data ada di bawahnya dan setengah di atasnya. Percentile itu perluasannya: percentile ke-90 berarti nilai yang 90% data ada di bawahnya. Median sama dengan percentile ke-50. Keduanya ngasih gambaran sebaran yang lebih jujur dari rata-rata pas datanya miring.
Konsep sebaran ini nyambung sama persen dari total yang juga ngukur posisi relatif tiap nilai.
Gimana cara hitung median di SQL?
Fungsi standarnya PERCENTILE_CONT. Sintaksnya agak beda dari fungsi biasa karena pakai WITHIN GROUP.
SELECT
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY nilai) AS median
FROM penjualan;
Pecahannya:
0.5: percentile yang dicari. 0.5 berarti median (50%).WITHIN GROUP (ORDER BY nilai): data harus diurutkan dulu, karena percentile butuh urutan.
Mau percentile lain? Ganti angkanya. 0.9 buat P90, 0.25 buat kuartil bawah.
SELECT
PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY nilai) AS p25,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY nilai) AS median,
PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY nilai) AS p90
FROM penjualan;
Apa beda PERCENTILE_CONT dan PERCENTILE_DISC?
| Fungsi | Cara kerja | Hasil |
|---|---|---|
PERCENTILE_CONT | Interpolasi antara dua nilai | Bisa angka yang ga ada di data |
PERCENTILE_DISC | Ambil nilai nyata dari data | Selalu nilai yang beneran ada |
Contoh: data [10, 20]. Median CONT ngasih 15 (rata-rata dua nilai tengah). Median DISC ngasih 10 atau 20 (nilai nyata). Buat median statistik biasa, pakai CONT. Buat kasus yang butuh nilai asli, misalnya kategori, pakai DISC.
Cara hitung median per grup
Tambah GROUP BY buat dapetin median tiap kategori.
SELECT
kategori,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY nilai) AS median
FROM penjualan
GROUP BY kategori;
Ini ngasih median nilai transaksi buat tiap kategori. Berguna banget buat bandingin sebaran antar grup, bukan cuma total.
Gimana hitung median di MySQL?
MySQL sampai versi 8 belum punya PERCENTILE_CONT. Kamu bisa akalin pakai window function. Idenya: urutin data, kasih nomor baris, lalu ambil yang di tengah.
SELECT AVG(nilai) AS median
FROM (
SELECT
nilai,
ROW_NUMBER() OVER (ORDER BY nilai) AS rn,
COUNT(*) OVER () AS total
FROM penjualan
) t
WHERE rn IN (FLOOR((total + 1) / 2), CEIL((total + 1) / 2));
Query ini ngambil satu atau dua baris tengah lalu dirata-rata. Kalau jumlah data ganjil, baris tengahnya satu. Kalau genap, dua baris tengah dirata-rata. Hasilnya setara PERCENTILE_CONT(0.5).
Contoh kasus: toko_berkah
Di dataset toko_berkah ngulikdata ada 14.880 transaksi setahun. Owner lihat rata-rata nilai transaksi Rp45.200 dan ngira kebanyakan pelanggan belanja segitu. Tapi angka itu nyesatin.
SELECT
ROUND(AVG(nilai)) AS rata_rata,
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY nilai) AS median,
PERCENTILE_CONT(0.9) WITHIN GROUP (ORDER BY nilai) AS p90
FROM transaksi;
Median-nya ternyata cuma Rp31.500, jauh di bawah rata-rata. Artinya separuh transaksi di bawah Rp31.500, dan angka rata-rata ketarik naik sama sedikit transaksi besar di P90 yang tembus Rp120.000. Median ngasih gambaran pelanggan tipikal yang lebih jujur. Keputusan promo jadi beda kalau kamu lihat median, bukan rata-rata.
Kesalahan umum
- Nyari fungsi MEDIAN langsung. Banyak database ga punya
MEDIAN(). Pakai PERCENTILE_CONT(0.5). - Lupa WITHIN GROUP. PERCENTILE_CONT butuh ORDER BY di dalam WITHIN GROUP. Tanpa itu, error.
- Ngira AVG sama dengan median. Dua-duanya beda. Rata-rata ketarik pencilan, median nggak.
- Pakai di MySQL tanpa cek versi. MySQL belum dukung fungsinya. Cek versi database sebelum nulis query.
FAQ
Kenapa SQL ga punya fungsi MEDIAN langsung?
Standar SQL nyediain median lewat PERCENTILE_CONT dan PERCENTILE_DISC, bukan fungsi MEDIAN terpisah. Alasannya, median cuma kasus khusus dari percentile, yaitu percentile ke-50. Jadi satu fungsi udah cukup buat semua. Beberapa database kayak Oracle punya MEDIAN() sendiri, tapi mayoritas ngarahin kamu ke PERCENTILE_CONT.
Kapan pakai median dan kapan rata-rata?
Pakai median kalau datanya miring atau ada pencilan, misalnya nilai transaksi, gaji, atau harga rumah, di mana beberapa angka besar bisa narik rata-rata. Pakai rata-rata kalau datanya nyebar merata tanpa ekstrem. Aturan gampangnya: kalau kamu ragu datanya simetris atau nggak, median lebih aman buat gambarin nilai tipikal.
Apa beda percentile dan kuartil?
Kuartil itu percentile di titik 25, 50, dan 75. Jadi kuartil pertama sama dengan percentile ke-25, kuartil kedua sama dengan median, dan kuartil ketiga percentile ke-75. Kuartil cuma cara ngomong percentile yang lebih umum buat bagi data jadi empat bagian sama besar. Konsep dan fungsinya sama.
Bisa ga PERCENTILE_CONT dipakai sebagai window function?
Bisa di beberapa database kayak PostgreSQL dan SQL Server, pakai OVER (PARTITION BY ...). Ini bikin kamu nempelin nilai percentile ke tiap baris tanpa nge-collapse data, mirip window function lain. Tapi dukungannya beda-beda per database, jadi cek dokumentasi versimu dulu sebelum ngandelin sintaks ini.
Penutup
Median di SQL cukup pakai PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kolom). Fungsi yang sama ngasih percentile berapa pun. Ingat, median lebih jujur dari rata-rata pas datanya miring.
Buat MySQL, akalin pakai window function ROW_NUMBER. Selalu cek versi database sebelum nulis.
Mau lancar window function dan agregasi SQL? Latihan langsung di NgulikSQL dan baca persen dari total dengan window function. Referensi resmi ada di dokumentasi fungsi agregasi PostgreSQL.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Composite Index di SQL: Cara Kerja dan Urutan Kolom
Composite index itu index atas beberapa kolom sekaligus. Urutan kolomnya nentuin query mana yang kebantu, lewat aturan leftmost prefix.
Menghitung Stickiness (DAU/MAU) di SQL
Stickiness ngukur seberapa sering user balik lagi. Ini cara hitung DAU, MAU, dan rasio stickiness pakai SQL, plus contoh aplikasi UMKM.
Menghitung DAU dan MAU dengan SQL
DAU dan MAU dua metrik wajib buat produk digital. Ini cara hitungnya pakai SQL, lengkap query DISTINCT, per bulan, sampai rasio stickiness.