Menghitung Bounce Rate dengan SQL
TL;DR
Bounce rate adalah persentase sesi yang cuma memuat satu halaman lalu pergi tanpa interaksi lanjutan. Di SQL, kamu hitung dengan mengelompokkan event per sesi, menandai sesi yang jumlah pageview-nya satu, lalu membaginya dengan total sesi dikali 100. Pola paling rapi pakai CTE untuk menghitung pageview per sesi dulu.
Bounce rate adalah persentase sesi yang cuma buka satu halaman lalu pergi tanpa lanjut ke halaman lain. Di SQL, kamu hitung dengan ngelompokin event per sesi, nandain sesi yang pageview-nya cuma satu, lalu dibagi total sesi dikali 100.
Angka ini ngasih tau seberapa cepat pengunjung kabur. Bounce tinggi di landing page produk artinya ada yang bikin orang ilfeel sebelum sempat lihat lebih jauh.
Aku tunjukin query dasarnya pakai CTE, cara pecah per landing page, sama definisi yang perlu kamu tentuin dulu biar angkanya nggak nyasar.
Apa itu bounce rate dalam SQL?
Bounce rate adalah rasio sesi satu-halaman terhadap total sesi, ditulis dalam persen. Sebuah sesi disebut bounce kalau pengunjung datang, lihat satu halaman, lalu pergi tanpa interaksi lanjutan. Di SQL, kamu ngukurnya dengan ngitung jumlah pageview per sesi lalu nyaring yang cuma satu.
Sebelum nulis query, tentuin dulu apa arti bounce buat kamu. Cara klasik ngitung dari jumlah pageview. Cara modern kayak GA4 ngitung dari ada atau nggaknya engagement, misalnya durasi minimal 10 detik.
Gimana rumus bounce rate?
Rumusnya: jumlah sesi bounce dibagi total sesi, dikali 100. Kalau 700 dari 1.000 sesi cuma buka satu halaman, bounce rate-nya 70%.
Bounce Rate = (Sesi Satu-Halaman / Total Sesi) x 100
Tantangan di SQL ada di langkah persiapan. Kamu perlu ngitung dulu berapa pageview tiap sesi sebelum bisa nandain mana yang bounce. Di sinilah CTE kepakai buat mecah query jadi dua tahap yang jelas.
Cara menghitung bounce rate dengan SQL
Anggap kamu punya tabel events dengan satu baris per pageview, berisi kolom session_id dan page. Langkah pertama, hitung pageview per sesi. Langkah kedua, hitung persentase sesi yang pageview-nya satu.
WITH sesi AS (
SELECT session_id, COUNT(*) AS jml_pageview
FROM events
GROUP BY session_id
)
SELECT
COUNT(*) AS total_sesi,
COUNT(*) FILTER (WHERE jml_pageview = 1) AS sesi_bounce,
ROUND(
COUNT(*) FILTER (WHERE jml_pageview = 1) * 100.0
/ NULLIF(COUNT(*), 0),
2) AS bounce_rate
FROM sesi;
CTE bernama sesi ngerjain GROUP BY buat ngitung pageview tiap sesi. Query utama lalu ngitung berapa banyak sesi yang jml_pageview-nya 1. Perkalian dengan 100.0 mastiin hasilnya desimal, dan NULLIF jagain dari bagi nol.
Kalau database kamu nggak dukung klausa FILTER, ganti pakai SUM dengan CASE WHEN:
ROUND(
SUM(CASE WHEN jml_pageview = 1 THEN 1 ELSE 0 END) * 100.0
/ NULLIF(COUNT(*), 0),
2) AS bounce_rate
Cara hitung bounce rate per landing page
Angka total berguna, tapi yang bikin keputusan adalah pecahan per halaman masuk. Tambahin landing page ke CTE, lalu GROUP BY di query utama:
WITH sesi AS (
SELECT
session_id,
COUNT(*) AS jml_pageview,
MIN(page) AS landing_page
FROM events
GROUP BY session_id
)
SELECT
landing_page,
COUNT(*) AS sesi,
ROUND(
COUNT(*) FILTER (WHERE jml_pageview = 1) * 100.0
/ NULLIF(COUNT(*), 0),
2) AS bounce_rate
FROM sesi
GROUP BY landing_page
ORDER BY bounce_rate DESC;
Catatan soal MIN(page): ini nyederhanain halaman masuk jadi nilai terkecil secara abjad, bukan yang paling awal secara waktu. Buat presisi, ganti pakai halaman dengan timestamp paling awal per sesi lewat window function.
Contoh kasus: bounce rate landing page toko_berkah
Anggap toko_berkah jalanin dua landing page: satu halaman promo diskon dari iklan, satu halaman katalog dari pencarian. Kamu jalanin query per landing page dan dapat hasil ini:
| Landing Page | Sesi | Bounce Rate |
|---|---|---|
| /promo-diskon | 1.900 | 71% |
| /katalog | 2.400 | 38% |
Halaman promo diskon punya bounce rate 71%, hampir dua kali halaman katalog yang cuma 38%. Padahal promo yang narik trafik paling banyak dari iklan.
Insight ini nyetir perbaikan. Orang yang klik iklan diskon banyak yang langsung pergi, mungkin karena halaman promonya nggak ngasih jalan jelas buat lanjut belanja. Ini yang perlu dibenerin sebelum nambah budget iklan.
Kesalahan umum waktu hitung bounce rate
Kesalahan pertama: lupa perkalian desimal. Nulis sesi_bounce / total_sesi tanpa 100.0 bikin hasilnya kebulet jadi 0. Selalu kali dengan 100.0.
Kesalahan kedua: salah struktur tabel. Bounce rate butuh satu baris per pageview biar bisa dihitung per sesi. Kalau tabelmu cuma nyimpen satu baris ringkasan per sesi, kamu nggak bisa tau jumlah pageview-nya.
Kesalahan ketiga: nggak nentuin definisi bounce. Ngitung pakai pageview beda hasil dari ngitung pakai engagement. Samain definisi di seluruh laporan biar angkanya bisa dibandingin antar waktu.
Pertanyaan yang sering muncul soal bounce rate SQL
Gimana ngitung bounce rate versi GA4 pakai durasi?
Ganti syarat bounce dari jumlah pageview ke engagement. Contoh, tandain sesi sebagai engaged kalau durasinya di atas 10 detik atau punya event penting, lalu bounce rate jadi 100% dikurangi engagement rate. Kamu perlu kolom durasi atau flag event di tabel biar bisa nerapin definisi ini.
Apa bounce rate bisa dihitung tanpa CTE?
Bisa, pakai subquery di dalam FROM. Tapi CTE bikin query jauh lebih kebaca karena mecah logikanya jadi dua tahap yang jelas: hitung pageview per sesi dulu, baru hitung persentasenya. Buat query yang bakal dibaca lagi nanti, CTE lebih ramah.
Gimana cara bandingin bounce rate antar bulan?
Tambahin kolom bulan ke CTE lewat DATE_TRUNC pada timestamp sesi, lalu GROUP BY bulan di query utama. Kamu bakal dapat satu baris bounce rate per bulan, gampang dibandingin buat lihat apakah perbaikan halaman beneran nurunin angka atau nggak.
Kesimpulan
Menghitung bounce rate dengan SQL intinya hitung pageview per sesi pakai CTE, tandain sesi satu-halaman, lalu bagi total sesi dikali 100.0. Pecah per landing page buat tau halaman mana yang bikin orang cepat kabur.
Mau lanjut ke metrik lain? Baca cara hitung conversion rate buat lihat sisi keberhasilannya, atau DAU dan MAU dengan SQL buat ukur pengguna aktif.
Referensi soal CTE ada di dokumentasi PostgreSQL WITH queries. Latihan query kayak gini langsung di browser lewat NgulikSQL, tanpa install database.
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.