SQL Date Bucketing: Kelompokkan Data per Rentang Waktu
Blog/Tutorial SQL/SQL Date Bucketing: Kelompokkan Data per Rentang Waktu

SQL Date Bucketing: Kelompokkan Data per Rentang Waktu

BimaBima
·13 Juli 2026·9 menit baca

Penulis

Bima

Bima

Founder & Data Professional

Bagikan

TL;DR

Date bucketing di SQL adalah teknik ngelompokkin tanggal ke dalam rentang tertentu, misalnya per bulan atau berdasarkan umur transaksi (0-7 hari, 8-30 hari). Ada dua cara utama: DATE_TRUNC buat rentang kalender yang rapi, dan CASE WHEN buat bucket kustom sesuai selisih hari.

Date bucketing di SQL adalah teknik ngelompokkin tanggal ke dalam rentang tertentu, misalnya per bulan atau berdasarkan umur transaksi kayak 0-7 hari dan 8-30 hari. Tujuannya biar data mentah yang penuh tanggal acak bisa dibaca sebagai kelompok yang rapi.

Kalau kamu pernah bikin laporan penjualan per minggu atau ngukur berapa banyak pelanggan yang belum belanja lebih dari sebulan, kamu udah butuh bucketing. Di bawah ini ada dua cara utama, contoh query siap pakai, dan data order toko yang bisa langsung kamu coba.

Apa itu date bucketing di SQL?

Date bucketing adalah proses ngubah kolom tanggal jadi label rentang yang bisa di-GROUP BY. Daripada ngitung tiap tanggal satu-satu, kamu kelompokkan dulu jadi ember (bucket) kayak per bulan, per kuartal, atau per selisih hari. Hasilnya jauh lebih gampang dibaca dan dibikin grafik.

Ada dua gaya bucketing yang paling sering dipakai analis. Pertama, rentang kalender yang teratur pakai DATE_TRUNC. Kedua, rentang kustom pakai CASE WHEN.

Gimana cara bucketing per bulan pakai DATE_TRUNC?

DATE_TRUNC motong tanggal ke awal periode. Jadi 2026-05-18 yang di-truncate ke bulan bakal jadi 2026-05-01. Semua tanggal di bulan yang sama jatuh ke nilai yang sama, tinggal di-GROUP BY.

SELECT
  DATE_TRUNC('month', order_date) AS bulan,
  COUNT(*)          AS jumlah_order,
  SUM(total_amount) AS total_omzet
FROM orders
GROUP BY DATE_TRUNC('month', order_date)
ORDER BY bulan;

Ganti 'month' jadi 'week', 'quarter', atau 'year' sesuai kebutuhan. Cara ini cocok buat grafik tren yang butuh rentang berturut-turut. Mau tau lebih dalam soal fungsi ini? Baca panduan DATE_TRUNC.

Gimana cara bikin bucket kustom pakai CASE WHEN?

Kalau batas rentangmu nggak seragam, DATE_TRUNC nggak cukup. Contohnya kamu mau kelompokkin order berdasarkan umurnya: yang baru (0-7 hari), yang sedang (8-30 hari), dan yang lama (30+ hari). Di sini CASE WHEN yang kerja.

SELECT
  CASE
    WHEN DATE '2026-07-16' - order_date <= 7  THEN '0-7 hari'
    WHEN DATE '2026-07-16' - order_date <= 30 THEN '8-30 hari'
    ELSE '30+ hari'
  END AS umur_bucket,
  COUNT(*) AS jumlah_order
FROM orders
GROUP BY 1;

Di PostgreSQL, selisih dua kolom DATE langsung ngasih jumlah hari dalam bentuk angka. Di database lain kamu mungkin perlu DATEDIFF atau fungsi serupa. Prinsipnya sama: hitung selisih hari, lalu petakan ke label.

Contoh kasus: recency order toko_berkah

Pakai data order toko_berkah di bawah. Anggap hari ini 16 Juli 2026, dan kamu mau lihat sebaran umur order buat nentuin mana pelanggan yang perlu di-follow up.

order_id | order_date  | total_amount
1        | 2026-05-02  | 150000
2        | 2026-05-18  | 275000
3        | 2026-06-05  | 90000
4        | 2026-06-22  | 320000
5        | 2026-07-01  | 60000
6        | 2026-07-10  | 480000

Setelah query CASE WHEN dijalanin, hasilnya: bucket 0-7 hari isi 1 order, bucket 8-30 hari isi 2 order, dan bucket 30+ hari isi 3 order. Dari sini kelihatan setengah dari order (3 dari 6) umurnya udah lewat sebulan. Buat toko yang jual barang cepat habis, itu sinyal buat ngingetin pelanggan lama biar balik belanja.

Angka bucket kayak gini bisa langsung kamu pakai buat segmentasi. Mau lanjut cari deretan tanggal yang bolong di data transaksi? Cek teknik di Gap and Island Analysis.

Bucketing per minggu dan per jam

Buat laporan mingguan, ganti unit DATE_TRUNC:

SELECT DATE_TRUNC('week', order_date) AS minggu, COUNT(*)
FROM orders
GROUP BY 1
ORDER BY minggu;

Kalau kolommu punya jam (timestamp), kamu juga bisa bucket per jam pakai DATE_TRUNC('hour', order_time), atau bikin bucket pagi-siang-sore pakai EXTRACT(HOUR FROM order_time) di dalam CASE WHEN.

Kesalahan umum saat date bucketing

  • Batas bucket tumpang tindih - kalau satu bucket <= 7 dan bucket lain >= 7, tanggal di angka 7 bisa kehitung dobel. Bikin batasnya nyambung tanpa overlap.
  • Bucket kosong ilang - GROUP BY cuma nampilin bucket yang ada datanya. Kalau kamu butuh semua rentang muncul, LEFT JOIN ke tabel referensi bucket.
  • Salah hari awal minggu - DATE_TRUNC di PostgreSQL mulai minggu dari Senin. Cek dokumentasi database kamu, karena beda engine bisa beda.
  • Lupa timezone - kalau kolomnya timestamp with time zone, hasil truncate bisa geser sehari. Samain timezone dulu sebelum bucketing.

DATE_TRUNC atau CASE WHEN?

KebutuhanPakai
Rentang kalender teratur (bulan, minggu)DATE_TRUNC
Rentang umur kustom (0-7, 8-30 hari)CASE WHEN
Grafik tren berturut-turutDATE_TRUNC
Segmentasi recency pelangganCASE WHEN

Sering kali kamu pakai keduanya di laporan yang sama. DATE_TRUNC buat sumbu waktu, CASE WHEN buat ngelabelin segmen.

FAQ

Pertanyaan yang sering muncul soal date bucketing ada di bagian bawah ini.

Penutup

Date bucketing bikin tanggal mentah jadi kelompok yang bisa dibaca. Inget dua alat utamanya: DATE_TRUNC buat rentang kalender, CASE WHEN buat rentang kustom. Pastiin batas bucket nyambung biar nggak ada data yang dobel atau kelewat.

Mau latihan query bucketing langsung di browser tanpa install database? Coba latihan interaktif di NgulikSQL. Buat referensi teknis, cek dokumentasi resmi PostgreSQL Date/Time Functions.

Coba Langsung

Mau praktek langsung? Mulai latihan SQL gratis

Latihan interaktif, langsung di browser.

Buka NgulikSQL →
Bagikan:
Bima
Ditulis oleh

Bima

Founder & Data Professional

Founder Ngulik Data. Passionate about making data analysis accessible for everyone.

Artikel terkait

Composite Index di SQL: Cara Kerja dan Urutan Kolom
Tutorial SQL
8 Oktober 2026•8 menit baca

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.

BimaBima
Menghitung Stickiness (DAU/MAU) di SQL
Tutorial SQL
5 Oktober 2026•10 menit baca

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.

BimaBima
Menghitung DAU dan MAU dengan SQL
Tutorial SQL
3 Oktober 2026•9 menit baca

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.

BimaBima
Kembali ke Blog
Ngulik Data logoNgulik Data

Platform edukasi data lengkap untuk professionals Indonesia. Belajar SQL, Data Analysis, dan lebih banyak lagi dengan praktek langsung dan feedback real-time.

© 2026 Ngulik Data. Semua hak dilindungi.

TAUTAN
BantuanHargaDatasetBlogAfiliasi
LEGAL
Syarat & KetentuanKebijakan Privasi
Ngulik Data
DatasetLeaderboardBlogStore