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.
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.
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;
| 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.
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.
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).
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.
MEDIAN(). Pakai PERCENTILE_CONT(0.5).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.
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.
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 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.
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.
Nambah 30 hari ke tanggal invoice, ngurangin sebulan buat cari periode lalu, ngitung selisih hari antar order. Semua itu aritmetika tanggal, dan SQL punya operator INTERVAL buat ngerjainnya.
Ngurangin tahun sekarang sama tahun lahir kelihatan gampang, tapi hasilnya sering meleset setahun kalau ulang tahunnya belum lewat. Ini cara hitung umur yang akurat di SQL.
Cara pakai DATE_TRUNC di SQL buat memotong timestamp jadi awal bulan, minggu, atau jam. Kunci bikin laporan penjualan per periode yang rapi.