Menghitung Stickiness (DAU/MAU) di SQL
TL;DR
Stickiness adalah rasio DAU dibagi MAU, biasanya ditulis dalam persen. Di SQL kamu hitung DAU pakai COUNT(DISTINCT user_id) per hari, MAU pakai COUNT(DISTINCT user_id) dalam 30 hari terakhir, lalu bagi keduanya. Rasio 20% artinya rata-rata user aktif 6 hari dari 30 hari.
Stickiness itu rasio DAU dibagi MAU. Di SQL, kamu hitung dua angka aktif pakai COUNT(DISTINCT user_id), terus bagi yang harian sama yang bulanan.
Rasio 20% artinya rata-rata user aktif 6 hari dari 30 hari. Makin tinggi, makin sering orang balik ke produk kamu.
Angka ini murah dihitung tapi sering salah pas praktek. Aku bahas rumusnya, query-nya, dan jebakan yang bikin hasilnya ngaco.
Apa itu stickiness (DAU/MAU)?
Stickiness adalah rasio Daily Active Users dibagi Monthly Active Users, ditulis dalam persen. Dia ngukur seberapa sering user balik dalam sebulan. Kalau nilainya 25%, rata-rata user aktif sekitar 7 sampai 8 hari dari 30 hari terakhir.
DAU itu jumlah user unik yang aktif dalam sehari. MAU itu jumlah user unik yang aktif dalam 30 hari. Definisi lengkap keduanya ada di glossary DAU dan glossary MAU.
Gimana cara hitung DAU dan MAU di SQL?
Pakai COUNT(DISTINCT user_id) buat dua-duanya. Buat DAU, kelompokkan per tanggal pakai GROUP BY. Buat MAU, hitung user unik dalam 30 hari terakhir tanpa dipecah per hari. Kuncinya DISTINCT, biar satu user yang buka 10 kali tetap dihitung satu.
Anggap kamu punya tabel events dengan kolom user_id dan event_date. DAU per hari:
SELECT event_date,
COUNT(DISTINCT user_id) AS dau
FROM events
GROUP BY event_date
ORDER BY event_date;MAU buat satu bulan tertentu:
SELECT COUNT(DISTINCT user_id) AS mau
FROM events
WHERE event_date >= '2026-09-01'
AND event_date < '2026-10-01';Tanpa DISTINCT, angkanya bakal jauh lebih besar dari user asli. Ini penyebab nomor satu stickiness yang aneh.
Gimana rumus stickiness di SQL?
Bagi DAU dengan MAU, lalu kali 100 buat jadiin persen. Pakai ROUND biar hasilnya rapi. Kalikan pembilangnya dengan 100.0 biar SQL nggak motong desimal jadi nol.
SELECT ROUND(100.0 * dau_value / mau_value, 1) AS stickiness_pct;Kalau DAU rata-rata 1.200 dan MAU 6.000, stickiness-nya 1200 / 6000 = 0,20 atau 20%. Artinya user tipikal aktif 6 hari dalam sebulan.
Gimana hitung stickiness harian yang bergerak?
Buat tren, kamu butuh DAU tiap hari dibagi MAU rolling 30 hari di hari yang sama. Pakai dua CTE, satu buat DAU harian, satu buat MAU rolling, lalu gabung pakai JOIN. Ini query yang aku pakai buat dashboard mingguan.
WITH dau AS (
SELECT event_date,
COUNT(DISTINCT user_id) AS daily_active
FROM events
GROUP BY event_date
),
mau AS (
SELECT d.event_date,
COUNT(DISTINCT e.user_id) AS monthly_active
FROM events e
JOIN (SELECT DISTINCT event_date FROM events) d
ON e.event_date > d.event_date - INTERVAL '30 day'
AND e.event_date <= d.event_date
GROUP BY d.event_date
)
SELECT dau.event_date,
dau.daily_active,
mau.monthly_active,
ROUND(100.0 * dau.daily_active / mau.monthly_active, 1) AS stickiness_pct
FROM dau
JOIN mau ON dau.event_date = mau.event_date
ORDER BY dau.event_date;MAU di sini dihitung ulang tiap hari buat 30 hari ke belakang. Jadi kamu dapat garis stickiness yang gerak, bukan cuma satu angka. Kalau baru belajar CTE, ada penjelasannya di glossary CTE.
Contoh kasus: aplikasi kasir UMKM
Aku pernah ngecek data aplikasi kasir buat warung dan toko kecil. Tabel event nyimpen tiap kali pemilik toko buka aplikasi buat catat transaksi.
Dari 3.400 MAU di bulan September, DAU rata-ratanya 918. Stickiness-nya 918 / 3400 = 27%. Artinya pemilik toko tipikal buka aplikasi sekitar 8 hari dalam sebulan.
| Metrik | Nilai |
|---|---|
| MAU September | 3.400 |
| DAU rata-rata | 918 |
| Stickiness | 27% |
| Estimasi hari aktif/user | ~8 hari |
Angka 27% ini menarik. Warung buka tiap hari, tapi banyak yang cuma catat transaksi 2 kali seminggu. Sisanya masih ditulis manual di buku. Itu celah yang jadi bahan rapat produk berikutnya.
Kesalahan umum saat menghitung stickiness
- Lupa DISTINCT. Tanpa DISTINCT, satu user yang buka banyak kali kehitung berkali-kali. DAU langsung membengkak dan stickiness bisa lewat 100%.
- Rentang MAU salah. MAU harus 30 hari yang mencakup hari DAU-nya. Kalau bulannya kalender penuh tapi DAU-nya tengah bulan, rasionya jadi timpang.
- Integer division.
dau / mautanpa100.0di SQL sering balikin 0. Kalikan pembilang dengan 100.0 dulu. - Nganggep tinggi selalu bagus. Stickiness turun karena MAU naik pesat itu wajar buat produk yang lagi tumbuh. Lihat angka mentahnya, jangan cuma rasio.
FAQ
Fungsi SQL apa yang wajib dipakai?
COUNT(DISTINCT user_id) buat DAU dan MAU. DISTINCT-nya nggak boleh lupa.
Stickiness bagusnya berapa?
Tergantung produk. Aplikasi harian 30% ke atas, e-commerce wajar 10 sampai 20%. Bandingin dengan bulan lalu.
Bedanya sama retention apa?
Stickiness ngukur seberapa sering dalam sebulan. Retention ngukur apakah user balik di periode berikutnya.
Lanjut praktek
Ringkasnya: DAU dan MAU pakai COUNT DISTINCT, stickiness itu DAU dibagi MAU kali 100, dan jangan lupa DISTINCT plus 100.0 biar hasilnya bener.
Mau latihan query window function dan agregasi sampai lancar? Coba modul SQL analitik di NgulikSQL, ada dataset yang bisa kamu pakai buat hitung metrik kayak gini langsung.
Kalau kamu mau lanjut ke metrik retensi, baca cara bikin cohort retention di SQL. Definisi metrik engagement juga dibahas di dokumentasi Amplitude soal DAU/MAU.
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 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.
Membuat Matriks Retensi Cohort dengan SQL
Pelanggan datang ramai di bulan promo, tapi berapa yang masih belanja tiga bulan kemudian? Matriks retensi cohort jawab itu. Ini cara bikinnya di SQL langkah demi langkah.