Main Logo
  • Home
  • About
  • Kursus
    • Paket Kursus
    • Roadmap Profesi
    • Data & AI
      • Data Analyst
      • Data Scientist
      • AI Engineer
      • Data Engineer
      • Business Intelligence (BI) Specialist
    • Infrastruktur & Keamanan
      • Network Engineer
      • System Engineer
      • DevOps Engineer
      • Security Engineer
      • Cloud Engineer
    • Programming & Web Development
      • Web & App Developer
      • Web Developer
      • WordPress Developer
      • Mobile Developer
    • Spesialisasi
      • Blockchain Engineer
      • IOT Engineer
      • Digital Marketing Specialist
  • Elearning
  • Blog
  • Portfolio
Daftar
Main Logo
  • Home
  • About
  • Kursus
    • Paket Kursus
    • Roadmap Profesi
    • Data & AI
      • Data Analyst
      • Data Scientist
      • AI Engineer
      • Data Engineer
      • Business Intelligence (BI) Specialist
    • Infrastruktur & Keamanan
      • Network Engineer
      • System Engineer
      • DevOps Engineer
      • Security Engineer
      • Cloud Engineer
    • Programming & Web Development
      • Web & App Developer
      • Web Developer
      • WordPress Developer
      • Mobile Developer
    • Spesialisasi
      • Blockchain Engineer
      • IOT Engineer
      • Digital Marketing Specialist
  • Elearning
  • Blog
  • Portfolio

Window Function SQL: RANK, ROW_NUMBER, LAG, LEAD

  • August 18, 2026
  • oleh Junior Alfredo Benerd Setiawan

Panduan Praktis dari Nol sampai Bisa — Bisa Langsung Dicoba di Google Colab / VSCode


TL;DR (buat yang buru-buru) Window function itu cara SQL untuk “mengintip” baris lain tanpa menghilangkan baris aslinya (beda sama GROUP BY yang meringkas). Empat fungsi paling sering dipakai: ROW_NUMBER() (nomor urut unik), RANK() (peringkat, bisa kembar & ada lompatan), LAG() (lihat baris sebelumnya), LEAD() (lihat baris berikutnya).


1. Mengapa Window Function SQL Itu Penting?

Bayangkan kamu punya data penjualan per bulan, terus disuruh bos:

  • “Ranking-in dong sales terbaik tiap cabang!”
  • “Bandingin omzet bulan ini vs bulan lalu, growth-nya berapa persen?”
  • “Ambil 1 transaksi terakhir tiap customer.”

Kalau pakai GROUP BY biasa, baris-baris detail kamu akan hilang karena diringkas. Di sinilah window function menyelamatkan hidup — dia menghitung sesuatu (ranking, rata-rata, nilai baris sebelah) tanpa meringkas data aslinya.

┌─────────────────────────────────────────────────┐
│  GROUP BY           →  banyak baris jadi sedikit  │
│  WINDOW FUNCTION    →  banyak baris tetap banyak,  │
│                         tapi tiap baris "sadar"     │
│                         posisi & tetangganya        │
└─────────────────────────────────────────────────┘

2. Anatomi Syntax-nya

Semua window function punya bentuk umum begini:

FUNGSI() OVER (
    PARTITION BY kolom_pengelompok   -- opsional, seperti "GROUP BY versi window"
    ORDER BY kolom_urutan            -- wajib untuk RANK, ROW_NUMBER, LAG, LEAD
)
BagianFungsi
PARTITION BYMembagi data jadi kelompok-kelompok kecil (mis. per cabang, per customer)
ORDER BYMenentukan urutan baris di dalam tiap kelompok (mis. dari omzet tertinggi)
OVER (...)“Jendela” tempat fungsi tersebut beroperasi — inilah asal nama window function

3. Siapkan Dataset — Bisa Jalan di Google Colab MAUPUN VSCode

Kita pakai SQLite via Python supaya kamu nggak perlu install database server. Kode ini identik persis di Colab dan VSCode (asal Python & pandas terinstall) Sihlakan gunakan Dataset ini untuk melakukan praktek langsung !

import sqlite3
import pandas as pd

# Buat koneksi database in-memory
conn = sqlite3.connect(":memory:")
cur = conn.cursor()

# Buat tabel penjualan
cur.execute("""
CREATE TABLE penjualan (
    id INTEGER PRIMARY KEY,
    cabang TEXT,
    sales TEXT,
    bulan TEXT,
    omzet INTEGER
)
""")

data = [
    (1, 'Jakarta', 'Andi',  '2026-01', 15000000),
    (2, 'Jakarta', 'Andi',  '2026-02', 18000000),
    (3, 'Jakarta', 'Budi',  '2026-01', 22000000),
    (4, 'Jakarta', 'Budi',  '2026-02', 19000000),
    (5, 'Bandung', 'Citra', '2026-01', 12000000),
    (6, 'Bandung', 'Citra', '2026-02', 25000000),
    (7, 'Bandung', 'Dewi',  '2026-01', 22000000),
    (8, 'Bandung', 'Dewi',  '2026-02', 22000000),
]

cur.executemany("INSERT INTO penjualan VALUES (?,?,?,?,?)", data)
conn.commit()

pd.read_sql("SELECT * FROM penjualan", conn)

Nanti hasilnya seperti ini juga sudah salin kode di atas :

Catatan VSCode: pastikan sudah pip install pandas di terminal, lalu jalankan file .py ini via Jupyter extension atau python nama_file.py (untuk versi non-Jupyter, ganti baris terakhir dengan print(...)).

Jika kamu ingin melatih Validasi Query SQL untuk melanjutkan tutorial ini ketingkat yang lebih tinggi sihlakan kunjungi artikel dibawah ini :

Cara Validasi Hasil Query SQL dengan Python

4. ROW_NUMBER() — “Nomor Antrean”

Memberi nomor urut unik, 1, 2, 3, … tanpa ada yang kembar, meskipun nilainya sama persis.

Mengapa harus pakai ROW_NUMBER()? Karena ini cara paling gampang untuk memberi nomor urut mutlak pada tiap baris di dalam kelompoknya — cocok kalau kamu butuh kepastian satu baris “juara” tanpa toleransi nilai kembar.

query = """
SELECT
    cabang,
    sales,
    bulan,
    omzet,
    ROW_NUMBER() OVER (
        PARTITION BY cabang
        ORDER BY omzet DESC
    ) AS no_urut
FROM penjualan;
"""

pd.read_sql(query, conn)
query = """
SELECT
    cabang, sales, bulan, omzet,
    ROW_NUMBER() OVER (PARTITION BY cabang ORDER BY omzet DESC) AS no_urut
FROM penjualan;
"""
pd.read_sql(query, conn)

ini hasilnya jika sudah di salin :

Kapan dipakai? Ambil “Top-1 per kelompok” (misal: transaksi terakhir tiap customer, produk terlaris per kategori).


5. RANK() — “Peringkat Lomba”

Mirip ROW_NUMBER(), tapi kalau nilainya sama, peringkatnya sama juga — dan nomor berikutnya melompat.

Mengapa RANK() beda dari ROW_NUMBER()? Karena di dunia nyata, dua orang bisa saja punya nilai yang sama persis (misalnya omzet kembar). RANK() menjawab pertanyaan “mengapa dua sales ini pantas dapat peringkat yang sama?” dengan cara yang adil secara statistik.

query = """
SELECT
    cabang,
    sales,
    omzet,
    RANK() OVER (
        PARTITION BY cabang
        ORDER BY omzet DESC
    ) AS peringkat
FROM penjualan
WHERE bulan = '2026-02';
"""

pd.read_sql(query, conn)

📊 Ilustrasi bedanya dengan ROW_NUMBER:

omzetROW_NUMBER()RANK()DENSE_RANK()
25.000.000111
22.000.000222
22.000.00032 (kembar)2 (kembar)
19.000.00044 (lompat ke 4)3 (tidak lompat)

6. LAG() — “Lihat ke Belakang”

Mengambil nilai dari baris sebelumnya dalam urutan yang sama. Paling populer untuk hitung growth month-over-month.

Mengapa LAG() penting untuk analisis tren? Karena mengapa sebuah angka naik atau turun baru bisa dijawab kalau kita bisa membandingkannya dengan nilai periode sebelumnya — dan itulah tepatnya yang dilakukan LAG().

query = """
SELECT
    cabang,
    sales,
    bulan,
    omzet,
    LAG(omzet, 1) OVER (
        PARTITION BY sales
        ORDER BY bulan
    ) AS omzet_bulan_lalu,
    ROUND(
        (omzet - LAG(omzet, 1) OVER (PARTITION BY sales ORDER BY bulan)) * 100.0
        / LAG(omzet, 1) OVER (PARTITION BY sales ORDER BY bulan), 2
    ) AS growth_persen
FROM penjualan;
"""

pd.read_sql(query, conn)

🎯 Kapan dipakai? Analisis tren (growth, churn), bandingkan nilai sekarang vs periode sebelumnya.

Mau Kuasai Window Function SQL: RANK, ROW_NUMBER, LAG, LEAD Sampai Bisa Praktik Langsung?

Materi ini juga kami ajarkan langsung di kelas Edusoft Center, dibimbing mentor, sampai kamu bisa praktik nyata — bukan cuma baca teori.

Tanya Kursus via WhatsApp Lihat contoh project nyata dari siswa kami →


7. LEAD() — “Lihat ke Depan”

Kebalikan dari LAG() — mengintip nilai baris berikutnya.

Mengapa perlu LEAD()? Mengapa tidak cukup hanya melihat ke belakang? Karena banyak analisis bisnis butuh jawaban atas “apa yang terjadi setelahnya” — misalnya mengapa transaksi menurun setelah promo berakhir. LEAD() membantu menjawab pertanyaan “mengapa” yang berorientasi ke masa depan itu.

query = """
SELECT
    cabang,
    sales,
    bulan,
    omzet,
    LEAD(omzet, 1) OVER (
        PARTITION BY sales
        ORDER BY bulan
    ) AS omzet_bulan_depan
FROM penjualan;
"""

pd.read_sql(query, conn)

🎯 Kapan dipakai? Prediksi sederhana, cari tahu “apa yang terjadi setelah event X” (mis. transaksi setelah promo).


8. Studi Kasus Gabungan — “Laporan Kinerja Sales”

Ini contoh nyata menggabungkan keempatnya sekaligus, khas laporan bisnis:

query = """
SELECT
    cabang,
    sales,
    bulan,
    omzet,
    RANK() OVER (PARTITION BY bulan ORDER BY omzet DESC) AS ranking_bulan_ini,
    ROW_NUMBER() OVER (PARTITION BY sales ORDER BY bulan) AS urutan_transaksi,
    LAG(omzet) OVER (PARTITION BY sales ORDER BY bulan) AS omzet_lalu,
    LEAD(omzet) OVER (PARTITION BY sales ORDER BY bulan) AS omzet_depan
FROM penjualan
ORDER BY bulan, ranking_bulan_ini;
"""

pd.read_sql(query, conn)
query = """
SELECT
    cabang, sales, bulan, omzet,
    RANK() OVER (PARTITION BY bulan ORDER BY omzet DESC) AS ranking_bulan_ini,
    ROW_NUMBER() OVER (PARTITION BY sales ORDER BY bulan) AS urutan_transaksi,
    LAG(omzet) OVER (PARTITION BY sales ORDER BY bulan) AS omzet_lalu,
    LEAD(omzet) OVER (PARTITION BY sales ORDER BY bulan) AS omzet_depan
FROM penjualan
ORDER BY bulan, ranking_bulan_ini;
"""
pd.read_sql(query, conn)

ini untuk hasil codenya jika sudah di salin :


9. Cheat Sheet — Simpan buat Contekan

FungsiMengintip Kemana?Nilai Kembar?Contoh Use-Case
ROW_NUMBER()Nomor urut diri sendiri❌ Selalu unikAmbil transaksi terbaru per user
RANK()Peringkat diri sendiri✅ Kembar + lompatRanking juara lomba
DENSE_RANK()Peringkat diri sendiri✅ Kembar, tanpa lompatLevel/tier customer
LAG(kolom, n)n baris ke belakang—Growth bulan ini vs lalu
LEAD(kolom, n)n baris ke depan—Selisih ke transaksi berikutnya
🔑 Rumus Sakti:
FUNGSI() OVER (PARTITION BY ... ORDER BY ...)
                    ↑                ↑
              "per kelompok"   "urutan dalam kelompok"

10. Latihan Mandiri (Coba Sendiri!)

Pakai dataset penjualan di atas, coba jawab pertanyaan ini dengan window function:

  1. 🥇 Siapa sales dengan omzet tertinggi di tiap bulan (pakai RANK())?
  2. 📈 Cabang mana yang omzetnya naik dari Januari ke Februari (pakai LAG())?
  3. 🎯 Ambil hanya transaksi pertama tiap sales (pakai ROW_NUMBER() = 1 di subquery/CTE).
WITH ranked AS (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY sales ORDER BY bulan) AS rn
    FROM penjualan
)
SELECT * FROM ranked WHERE rn = 1;

</details>


11. Mengapa Harus Latihan Pakai Google Colab atau VSCode?

Banyak yang belajar SQL cuma modal baca teori atau nonton video — padahal window function itu jenis materi yang baru “klik” di kepala kalau dicoba langsung. Berikut alasan mengapa dua tools ini jadi pilihan terbaik buat latihan:

AlasanPenjelasan
🆓 Gratis & tanpa install ribetGoogle Colab jalan 100% di browser, tanpa perlu install database server sama sekali. VSCode juga gratis dan ringan.
⚡ Bisa langsung lihat hasil queryNggak perlu tools tambahan seperti DBeaver/pgAdmin — cukup pandas.read_sql(), hasil tabelnya langsung muncul rapi di bawah cell.
🔁 Iterasi cepat = belajar lebih efektifMengapa ini penting? Karena begitu ubah ORDER BY atau PARTITION BY, kamu bisa langsung re-run dan lihat efeknya detik itu juga — bukan nunggu proses deploy atau setup server.
☁️ Colab: tidak butuh spek laptop tinggiSemua proses jalan di server Google, jadi laptop dengan RAM kecil pun tetap lancar buat eksperimen dataset besar.
🖥️ VSCode: mendekati workflow kerja nyataKalau tujuannya melamar kerja sebagai data analyst, latihan di VSCode membiasakan kamu dengan environment yang mirip dipakai di dunia industri (extension Jupyter, integrasi Git, dsb).
📁 Mudah disimpan & dibagikanNotebook Colab bisa langsung di-share via link Google Drive, sementara file .ipynb di VSCode gampang di-push ke GitHub sebagai portofolio.

💡 Kesimpulan singkat: Mengapa harus praktik, bukan cuma baca? Karena window function penuh dengan detail kecil (urutan PARTITION BY vs ORDER BY, efek RANK vs DENSE_RANK, dll) yang jauh lebih cepat dipahami lewat trial-and-error langsung, dibanding hanya membayangkan hasilnya di kepala.


12. Cara Menjalankan di Google Colab vs VSCode

LangkahGoogle ColabVSCode
Install librarySudah tersedia (sqlite3, pandas bawaan)pip install pandas
Buat fileNew Notebook (.ipynb)Buat file .ipynb + install ekstensi Jupyter
JalankanKlik ▶️ tiap cellRun Cell di atas tiap blok kode
Lihat hasil tabelOtomatis muncul di bawah cellOtomatis muncul di panel output

✅ Tips: Kalau mau pakai database sungguhan (PostgreSQL/MySQL), tinggal ganti sqlite3.connect(":memory:") dengan koneksi library seperti psycopg2 atau mysql-connector-python — syntax window function-nya hampir sama persis.


Penutup

Window function adalah salah satu skill SQL yang paling sering dites di interview data analyst/data scientist — karena satu query bisa menggantikan puluhan baris kode Python untuk hal seperti ranking, growth rate, atau moving comparison.

Ingat urutan belajarnya: PARTITION BY (kelompokkan) → ORDER BY (urutkan) → pilih fungsi (ROW_NUMBER/RANK/LAG/LEAD) sesuai kebutuhan.

Selamat mencoba, semoga query-mu makin smooth seperti window function-nya! 🪟✨


Ditulis dengan contoh dataset fiktif untuk keperluan pembelajaran. Semua kode teruji dan siap dijalankan langsung di Google Colab maupun VSCode.

Penulis

Junior Alfredo Benerd Setiawan

Mau Kuasai Window Function SQL: RANK, ROW_NUMBER, LAG, LEAD Sampai Bisa Praktik Langsung?

Materi ini juga kami ajarkan langsung di kelas Edusoft Center, dibimbing mentor, sampai kamu bisa praktik nyata — bukan cuma baca teori.

Tanya Kursus via WhatsApp Lihat contoh project nyata dari siswa kami →

Tags: Google Colab SQLRANK SQLROW_NUMBER SQLsqlsql untuk data analystSQL Window FunctionTutorial SQLVSCode SQLWindow Function SQL
Previous Post
Next Post

Post comment

Cancel reply

Your email address will not be published. Required fields are marked *

Recent Posts

  • Cara Membersihkan Data Log Jaringan Menggunakan Python
  • Business Question: Cara Menyusun Pertanyaan Data yang Tajam
  • Cara Menjawab Business Question dengan Kombinasi SQL dan Python
  • Exploratory Data Analysis pada Data Penjualan
  • Mengenal Distribusi Data dengan Histogram dan Boxplot di Python

Arsip

  • August 2026
  • July 2026
  • June 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • September 2025
  • August 2025
  • July 2025
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
  • February 2018
  • January 2018
  • December 2017
  • November 2017
  • October 2017
  • September 2017
  • August 2017
  • July 2017
  • June 2017
  • May 2017
  • April 2017
  • March 2017
  • February 2017
  • January 2017
  • December 2016
  • November 2016
  • October 2016
  • September 2016
  • August 2016
  • July 2016
  • June 2016
  • May 2016
  • April 2016
  • March 2016
  • February 2016
  • January 2016
  • December 2015
  • November 2015
  • October 2015
  • September 2015
  • August 2015
  • July 2015
  • June 2015
  • May 2015
  • April 2015
  • March 2015
  • February 2015
  • January 2015
  • December 2014
  • November 2014
  • October 2014
  • September 2014
  • August 2014
  • July 2014
  • June 2014
  • May 2014
  • April 2014
  • March 2014
  • February 2014
  • January 2014
  • December 2013
  • November 2013
  • October 2013
  • September 2013
  • August 2013
  • July 2013
  • June 2013
  • May 2013
  • April 2013
  • March 2013
  • February 2013
  • January 2013
  • December 2012
  • November 2012
  • October 2012
  • September 2012
  • August 2012
  • July 2012
  • June 2012
  • May 2012
  • April 2012
  • December 2011
  • November 2011

Tags

apache web server dns server kursus android kursus database kursus dns dan web server kursus dns server kursus ethical hacking kursus hacking kursus jaringan kursus jaringan linux Kursus Komputer kursus komputer di solo kursus komputer di solo / surakarta kursus komputer di surakarta kursus linux Kursus Linux Forensics kursus linux networking kursus linux security kursus linux server kursus mikrotik kursus networking kursus network security kursus php Kursus PHP dan MySQL kursus php mysql kursus proxy kursus security kursus ubuntu kursus ubuntu server kursus web kursus web security kursus web server kursus wordpress kursus wordpress theme linux MySQL pelatihan komputer di solo PHP python security training komputer training komputer di solo tutorial php ubuntu wordpress

© Edusoft Center - Kursus Komputer di Solo | 2010 - 2026 | Privacy Policy | Site Map | Portfolio Magang | Butuh tim kami langsung yang mengerjakan? Lihat layanan implementasi →

All Right Reserved

WhatsApp us