Segmentasi Pelanggan dengan SQL: Metode RFM (2026)
TL;DR
Segmentasi pelanggan dengan SQL paling praktis pakai metode RFM: Recency (kapan terakhir belanja), Frequency (seberapa sering), Monetary (total belanja). Hitung ketiganya per pelanggan, lalu bagi tiap dimensi jadi kuartil pakai window function NTILE(4). Gabungan skornya jadi dasar buat kasih label segmen kayak VIP, loyal, atau berisiko hilang, tanpa perlu tools mahal atau machine learning.
Cara paling praktis segmentasi pelanggan dengan SQL pakai metode RFM: hitung kapan terakhir mereka belanja, seberapa sering, dan berapa total belanjanya.
Semua pelanggan diperlakukan sama itu boros. Yang belanja tiap minggu dan yang cuma mampir sekali dikasih promo yang sama, hasilnya budget kebuang. RFM misahin mereka jadi kelompok yang tiap-tiapnya butuh perlakuan beda.
Di bawah ini query lengkapnya, dari hitung RFM sampai kasih label segmen yang bisa langsung ditindaklanjuti.
Apa itu segmentasi pelanggan RFM?
RFM adalah metode segmentasi berdasarkan tiga dimensi: Recency (kapan terakhir belanja), Frequency (seberapa sering), dan Monetary (total belanja). Tiap pelanggan dikasih skor di ketiganya, lalu digabung jadi segmen yang punya arti bisnis.
Kenapa RFM populer? Karena simpel dan langsung kepakai. Gak butuh machine learning, gak butuh tools mahal. Cukup data transaksi dan SQL. Buat bisnis yang lebih besar, ini pintu masuk sebelum ke cohort analysis yang lebih dalam.
Gimana cara hitung R, F, dan M per pelanggan?
Mulai dari agregasi. Satu pelanggan, tiga angka.
SELECT
customer_id,
CURRENT_DATE - MAX(order_date) AS recency,
COUNT(*) AS frequency,
SUM(total) AS monetary
FROM orders
GROUP BY customer_id;
Recency itu selisih hari antara hari ini dan order terakhir. Makin kecil, makin baru dia belanja. Frequency itu jumlah transaksi. Monetary itu total rupiah yang dia keluarin.
Perhatiin recency: nilai kecil itu bagus (baru belanja), nilai besar itu buruk (lama hilang). Ini kebalik dari frequency dan monetary. Nanti pengaruh ke arah pemeringkatan.
Gimana kasih skor kuartil pakai NTILE?
NTILE(4) bagi pelanggan jadi empat kelompok sama besar berdasarkan urutan nilai. Ini cara adil kasih skor 1 sampai 4, karena batasnya nyesuain data kamu, bukan angka tebakan.
NTILE(4) OVER (ORDER BY recency DESC) AS r_score,
NTILE(4) OVER (ORDER BY frequency ASC) AS f_score,
NTILE(4) OVER (ORDER BY monetary ASC) AS m_score
Buat recency aku pakai DESC biar pelanggan yang paling baru belanja (recency kecil) dapat skor 4. Buat frequency dan monetary pakai ASC biar yang paling tinggi dapat skor 4. Jadi di semua dimensi, skor 4 selalu berarti "pelanggan terbaik". NTILE ini window function, konsepnya aku bahas di glossary window function.
Gimana ngasih label segmen dari skor?
Gabung semuanya di satu query pakai CTE, lalu terjemahin kombinasi skor jadi label pakai CASE WHEN.
WITH rfm AS (
SELECT
customer_id,
CURRENT_DATE - MAX(order_date) AS recency,
COUNT(*) AS frequency,
SUM(total) AS monetary
FROM orders
GROUP BY customer_id
),
skor AS (
SELECT
customer_id,
NTILE(4) OVER (ORDER BY recency DESC) AS r_score,
NTILE(4) OVER (ORDER BY frequency ASC) AS f_score,
NTILE(4) OVER (ORDER BY monetary ASC) AS m_score
FROM rfm
)
SELECT
customer_id,
r_score, f_score, m_score,
CASE
WHEN f_score = 4 AND m_score = 4 THEN 'VIP'
WHEN r_score = 4 AND f_score >= 3 THEN 'Loyal'
WHEN r_score = 1 THEN 'Berisiko Hilang'
ELSE 'Reguler'
END AS segmen
FROM skor
ORDER BY m_score DESC, f_score DESC;
Aturan label di sini contoh. Sesuaikan sama bisnismu. Yang penting tiap segmen punya tindak lanjut jelas: VIP dikasih prioritas, Berisiko Hilang dikirim promo pengingat. Logika CASE WHEN lengkap ada di CASE WHEN di SQL.
Contoh kasus: segmentasi pelanggan toko_berkah
Dataset toko_berkah punya 2.147 pelanggan dari 8.412 transaksi, periode Januari sampai Juni 2026. Waktu query RFM di atas dijalanin, sebaran segmennya bikin toko ini mikir ulang strategi promo.
| Segmen | Jumlah | % Pelanggan | % Omzet |
|---|---|---|---|
| VIP | 168 | 8% | 34% |
| Loyal | 412 | 19% | 29% |
| Reguler | 764 | 36% | 27% |
| Berisiko Hilang | 803 | 37% | 10% |
Angka yang paling nampol: 8% pelanggan VIP nyumbang 34% omzet. Sementara 37% pelanggan yang Berisiko Hilang cuma nyumbang 10%. Toko ini sebenernya ditopang segelintir orang.
Sebelum ini, toko_berkah nyebar diskon rata ke semua pelanggan lewat broadcast. Setelah lihat segmennya, mereka geser: VIP dapat akses produk baru duluan, dan yang Berisiko Hilang dapat voucher khusus buat narik balik. Budget promo yang sama, sasaran lebih tepat. Buat ngukur nilai jangka panjang tiap segmen, lanjutin dengan Customer Lifetime Value SQL.
Kesalahan umum saat segmentasi RFM
Salah arah pemeringkatan recency. Ini jebakan nomor satu. Recency kecil itu bagus, jadi arah ORDER BY-nya harus dibalik biar skor 4 buat yang baru belanja.
Pakai batas skor manual. Nentuin "monetary di atas 1 juta itu skor 4" gampang meleset kalau sebaran datamu beda. NTILE ngatur batas otomatis dari data.
Lupa filter transaksi batal. Order yang di-refund atau dibatalin bikin monetary bengkak. Filter status dulu sebelum hitung.
Nganggep segmen permanen. Pelanggan pindah segmen tiap bulan. Jalanin ulang query-nya rutin, jangan simpan label lama.
Bikin terlalu banyak segmen. 11 segmen RFM klasik sering kebanyakan buat tim kecil. Mulai dari 4 sampai 5 yang tiap-tiapnya punya aksi jelas.
FAQ
Apa itu segmentasi pelanggan RFM?
RFM adalah metode segmentasi pelanggan berdasarkan tiga hal: Recency (kapan terakhir belanja), Frequency (seberapa sering belanja), dan Monetary (total uang yang dibelanjain). Tiap pelanggan dikasih skor di tiga dimensi itu, lalu digabung jadi segmen. Metode ini populer karena simpel, gak butuh machine learning, dan hasilnya langsung kepakai buat nentuin siapa yang dikasih promo dan siapa yang perlu ditarik lagi.
Kenapa pakai NTILE buat segmentasi di SQL?
NTILE(4) membagi pelanggan jadi empat kelompok sama besar berdasarkan urutan nilai, jadi kuartil. Ini cara adil buat ngasih skor 1 sampai 4 di tiap dimensi RFM, karena batasnya nyesuain sebaran data kamu sendiri, bukan angka tetap yang ditebak. Pelanggan di 25% teratas monetary otomatis dapat skor 4. Tanpa NTILE, kamu harus nentuin batas manual yang gampang meleset.
Gimana cara ngasih label segmen dari skor RFM?
Pakai CASE WHEN buat nerjemahin kombinasi skor jadi label yang bisa dibaca manusia. Misalnya pelanggan dengan frequency dan monetary skor 4 dikasih label VIP. Pelanggan yang recency skor 1 (lama gak belanja) dikasih label Berisiko Hilang. Aturan labelnya kamu sesuaikan sama bisnis. Yang penting tiap segmen punya tindak lanjut yang jelas, bukan cuma nama keren.
Apakah segmentasi RFM butuh machine learning?
Gak. RFM murni hitungan agregat dan pemeringkatan, semuanya bisa dikerjain dengan SQL biasa pakai GROUP BY dan window function. Machine learning baru masuk kalau kamu mau segmentasi yang lebih rumit, misalnya clustering dengan banyak variabel. Buat mayoritas toko dan bisnis kecil menengah, RFM dengan SQL udah cukup akurat dan jauh lebih gampang dijelasin ke tim non-teknis.
Seberapa sering segmentasi pelanggan harus diperbarui?
Tergantung ritme bisnis. Buat retail atau e-commerce, sebulan sekali biasanya pas, karena recency pelanggan berubah terus. Buat bisnis dengan siklus beli panjang, sekali per kuartal cukup. Kuncinya, segmentasi itu foto sesaat, bukan label permanen. Pelanggan bisa pindah dari VIP ke Berisiko Hilang kalau dia berhenti belanja, jadi jalanin ulang query-nya secara rutin.
Penutup
Ringkasnya:
- Hitung Recency, Frequency, Monetary per pelanggan pakai GROUP BY.
- Kasih skor kuartil pakai
NTILE(4), hati-hati arah recency dibalik. - Terjemahin skor jadi label segmen pakai CASE WHEN, tiap segmen punya aksi.
Jalanin query RFM lengkap di atas ke tabel order kamu. Kalau ternyata segelintir VIP nyumbang sebagian besar omzet, kamu baru nemu prioritas yang selama ini kelewat.
Mau lanjut deteksi pelanggan yang mulai kabur? Baca Churn Rate SQL. Sintaks NTILE dan window function resminya ada di dokumentasi 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.