Window Function vs GROUP BY di SQL: Kapan Pakai yang Mana (2026)
TL;DR
GROUP BY ngeringkas banyak baris jadi satu baris per grup, jadi detail transaksinya hilang. Window function ngitung nilai agregat tapi tetap nyimpen semua baris asli, cuma nambahin kolom baru. Pakai GROUP BY buat ringkasan total, pakai window function kalau kamu butuh detail baris plus angka grupnya sekaligus.
GROUP BY ngeringkas banyak baris jadi satu baris per grup. Window function ngitung angka yang sama tapi tetap nyimpen semua baris asli, cuma nambahin kolom baru.
Itu beda intinya. Dan itu yang sering bikin bingung waktu belajar SQL. Dua-duanya bisa ngitung total per grup, tapi hasil akhirnya beda jauh.
Di sini aku bakal jelasin bedanya lewat query yang sama persis, kapan pakai yang mana, plus contoh nyata dari data penjualan UMKM. Habis ini kamu nggak bakal ketuker lagi.
Apa bedanya window function dan GROUP BY?
GROUP BY ngelipet banyak baris jadi satu baris per grup, jadi detail transaksinya hilang. Window function ngitung angka agregat yang sama tapi nggak ngapus baris apa pun, dia nambahin kolom hasil di tiap baris asli. Punya 500 transaksi, GROUP BY kota bisa jadi 5 baris. Window function tetap 500 baris.
| Aspek | GROUP BY | Window Function |
|---|---|---|
| Jumlah baris hasil | Menyusut jadi 1 per grup | Sama kayak data asli |
| Detail baris | Hilang | Tetap ada |
| Cara nulis | Klausa GROUP BY terpisah | Di dalam OVER() |
| Bisa ranking? | Nggak langsung | Bisa |
| Filter hasil | Pakai HAVING | Pakai CTE atau subquery |
| Paling cocok buat | Ringkasan total | Detail plus konteks grup |
Kalau kamu masih baru sama window function, intinya dia keluarga fungsi yang ngitung berdasarkan sekumpulan baris tanpa gabungin barisnya.
Kapan pakai GROUP BY?
Pakai GROUP BY kalau kamu cuma butuh ringkasan dan nggak peduli detail baris. Total penjualan per kota, jumlah transaksi per bulan, rata-rata nota per kategori. Kalau output yang kamu mau memang satu baris per grup, GROUP BY paling simpel dan paling hemat.
Contohnya, bos nanya total omzet tiap kota. Kamu nggak butuh lihat 500 transaksi, cukup 5 angka kota.
SELECT kota, SUM(total_harga) AS total_kota
FROM toko_berkah
GROUP BY kota;
Hasilnya 5 baris kalau ada 5 kota. Bersih, ringkas, langsung jawab pertanyaan. Detail transaksinya sengaja dibuang karena emang nggak dibutuhin.
Mau nyaring hasilnya? Pakai HAVING, bukan WHERE. Misalnya cuma mau kota yang omzetnya di atas 10 juta. Aku bahas ini lebih dalam di GROUP BY dan HAVING di SQL.
Kapan pakai window function?
Pakai window function kalau kamu butuh detail baris plus angka grupnya sekaligus. Misalnya, kamu mau lihat tiap transaksi tapi juga tau berapa kontribusinya ke total kota. GROUP BY nggak bisa kasih ini karena barisnya udah dilipet. Window function nyimpen barisnya sambil nempelin angka agregat.
SELECT id_transaksi, kota, total_harga,
SUM(total_harga) OVER (PARTITION BY kota) AS total_kota
FROM toko_berkah;
Perhatiin OVER (PARTITION BY kota). Itu yang bilang ke SQL: hitung total per kota, tapi jangan buang barisnya. Tiap transaksi Bandung dapat angka total Bandung yang sama, tapi barisnya tetap utuh.
Dari sini kamu bisa langsung hitung persentase kontribusi tiap transaksi. Sesuatu yang butuh subquery plus JOIN kalau pakai GROUP BY, tapi cukup satu baris pakai window function. Detail cara kerja PARTITION BY ada di PARTITION BY di SQL.
Contoh sisi-sisi: query yang sama, hasil beda
Ini yang bikin bedanya kelihatan jelas. Anggap ada 4 transaksi di 2 kota.
Pakai GROUP BY, hasilnya 2 baris:
| kota | total_kota |
|---|---|
| Bandung | 660.000 |
| Jakarta | 625.000 |
Pakai window function, hasilnya tetap 4 baris:
| id_transaksi | kota | total_harga | total_kota |
|---|---|---|---|
| TRX-001 | Bandung | 450.000 | 660.000 |
| TRX-014 | Bandung | 210.000 | 660.000 |
| TRX-002 | Jakarta | 450.000 | 625.000 |
| TRX-009 | Jakarta | 175.000 | 625.000 |
Angka totalnya sama. Yang beda jumlah barisnya. GROUP BY buang detail, window function nyimpen. Pilihan kamu tergantung: butuh detailnya nggak?
Contoh kasus: audit kontribusi transaksi toko_berkah
Ini kasus nyata yang GROUP BY nggak bisa selesaiin sendirian. Pertanyaannya: transaksi mana yang nyumbang lebih dari 20% ke total kotanya?
Kamu butuh dua hal sekaligus: detail tiap transaksi, dan total kotanya buat pembanding. Window function yang bisa.
SELECT id_transaksi, kota, total_harga,
ROUND(total_harga * 100.0 /
SUM(total_harga) OVER (PARTITION BY kota), 1) AS persen_kota
FROM toko_berkah;
Waktu aku jalanin ini di dataset ngulikdata (4.812 transaksi, 12 kota), keluar 46 transaksi yang masing-masing nyumbang lebih dari 20% total kotanya. Semuanya kejadian di kota-kota kecil dengan transaksi sedikit, di mana satu pembelian besar bisa dominan.
Angka itu nggak akan kelihatan dari GROUP BY. Kalau kamu ringkas per kota, kamu cuma dapat total, bukan siapa yang nyumbang berapa. Window function yang bikin level detail itu bisa dibandingin sama grupnya.
Bisa nggak dipakai bareng?
Bisa, dan ini pola yang sering banget kepake. GROUP BY meringkas dulu, lalu window function jalan di atas hasilnya buat ranking atau persentase. Keduanya nggak saling tabrakan, malah saling nutupin.
SELECT kota, produk, SUM(total_harga) AS omzet,
ROW_NUMBER() OVER (
PARTITION BY kota ORDER BY SUM(total_harga) DESC
) AS peringkat
FROM toko_berkah
GROUP BY kota, produk;
Di sini GROUP BY yang ngeringkas omzet per produk per kota. Window function jalan setelahnya, ngasih nomor peringkat di tiap kota. Ini cara standar nyari produk terlaris per kota. Konsep GROUP BY dan window function kerja di lapisan yang beda, jadi bisa numpuk.
Kesalahan umum milih antara keduanya
1. Pakai window function padahal cuma butuh ringkasan. Kalau outputnya emang satu baris per grup, GROUP BY lebih simpel dan hemat. Jangan overkill.
2. Maksa GROUP BY buat ranking. GROUP BY nggak bisa ngasih peringkat langsung. Kalau kamu butuh Top N per grup, itu wilayah window function.
3. Filter window function di WHERE. Nggak jalan. WHERE dieksekusi sebelum window function, jadi kolomnya belum ada. Pakai CTE atau subquery buat nyaring.
4. Lupa PARTITION BY. Window function tanpa PARTITION BY ngitung ke seluruh tabel, bukan per grup. Kalau maunya per kota, PARTITION BY kota wajib ada.
5. Ngira window function selalu lebih canggih jadi selalu lebih baik. Tool yang tepat itu yang paling pas sama kebutuhan, bukan yang paling ribet. Ringkasan sederhana? GROUP BY menang.
FAQ
Apa beda utama window function dan GROUP BY?
GROUP BY ngelipet banyak baris jadi satu baris per grup, jadi detail per transaksinya hilang. Window function ngitung angka yang sama tapi nggak ngapus baris, dia cuma nambahin kolom hasil di tiap baris asli. Punya 500 transaksi, pakai GROUP BY kota bisa jadi 5 baris. Pakai window function, tetap 500 baris dengan kolom total kota di masing-masing.
Mana yang lebih cepat, GROUP BY atau window function?
GROUP BY biasanya lebih ringan karena hasilnya lebih sedikit baris. Window function butuh sorting dan nyimpen semua baris, jadi agak lebih berat. Tapi bedanya sering nggak kerasa di data kecil. Buat data jutaan baris, kalau kamu cuma butuh ringkasan, GROUP BY lebih hemat. Kalau butuh detail plus agregat, window function tetap lebih cepat daripada JOIN berulang.
Bisa nggak window function dan GROUP BY dipakai bareng?
Bisa, dan ini pola yang sering kepake. GROUP BY meringkas dulu, lalu window function jalan di atas hasil ringkasan itu buat ranking atau persentase. Contohnya, kamu GROUP BY produk buat dapat total per produk, lalu pakai ROW_NUMBER buat ngasih peringkat. Keduanya kerja bareng di satu query tanpa masalah.
Kenapa nggak bisa filter window function di WHERE?
Karena urutan eksekusi SQL. WHERE jalan sebelum window function dihitung, jadi waktu WHERE dieksekusi, kolom hasil window function belum ada. Buat nyaring hasil window function, bungkus query-nya jadi CTE atau subquery, lalu filter di lapisan luar. Ini beda dari GROUP BY yang hasilnya bisa langsung difilter pakai HAVING.
Kapan sebaiknya pilih GROUP BY daripada window function?
Pilih GROUP BY kalau kamu cuma butuh ringkasan dan nggak peduli detail baris. Contohnya, total penjualan per kota, jumlah transaksi per bulan, atau rata-rata per kategori. Kalau outputnya memang satu baris per grup, GROUP BY lebih simpel dan lebih hemat. Window function baru menang kalau kamu butuh detail baris plus konteks grupnya di saat yang sama.
Penutup
Bedanya gampang diinget. GROUP BY ngeringkas, window function nemenin. Butuh ringkasan total? GROUP BY. Butuh detail baris plus angka grupnya? Window function.
Dan mereka nggak saling saingan. Query paling berguna sering pakai keduanya: GROUP BY buat ngeringkas, window function buat ranking di atasnya. Detail perilaku window function ada di dokumentasi resmi PostgreSQL.
Mau langsung mahir? Buka panduan window function SQL, jalanin query di atas pakai dataset toko_berkah, dan bandingin sendiri hasilnya. Lima belas menit, dan bedanya nempel di kepala.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel terkait
Fungsi NTH_VALUE di SQL untuk Ambil Nilai ke-N (2026)
NTH_VALUE ngambil nilai baris ke-N dalam window, tapi frame default-nya sering bikin hasil NULL. Ini sintaksnya, cara benerin frame, plus contoh transaksi toko.
Running Max dan Min dengan Window Function SQL
Lacak nilai tertinggi dan terendah berjalan di SQL pakai window function MAX dan MIN OVER. Ini sintaks, frame clause, dan contoh rekor omzet toko.
Analisa Afinitas Produk (Cross-Sell) dengan SQL
Produk apa yang sering dibeli bareng? Analisa afinitas produk pakai SQL self JOIN jawab itu. Ini cara hitung support, confidence, dan lift buat strategi cross-sell.