0Pricing
Coding Interview Prep · Pelajaran

Memfilter Hasil Jendela

Mengapa Anda harus membungkus fungsi jendela dalam subkueri atau CTE untuk memfilternya.

Memfilter Hasil Jendela adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Mengapa Anda Tidak Dapat Menyaring Jendela di WHERE

Ini adalah "jebakan" yang sering muncul dalam wawancara: menulis WHERE ROW_NUMBER() OVER (...) = 1 akan menimbulkan kesalahan. Fungsi jendela tidak diizinkan di WHERE, GROUP BY, atau HAVING.

Alasannya adalah urutan eksekusi logis. WHERE dijalankan untuk memilih baris sebelum fungsi jendela dievaluasi. Jendela bahkan belum dihitung, sehingga tidak dapat dirujuk dalam penyaringan.

Penjelasan Urutan Eksekusi

Fungsi jendela dihitung dalam fase khusus yang berlangsung setelah FROM, WHERE, GROUP BY, dan HAVING, tetapi sebelum ORDER BY dan LIMIT akhir.

Jadi, ketika WHERE dijalankan, peringkat atau nomor baris belum ada. Untuk menyaring berdasarkan hasil tersebut, Anda harus membiarkan jendela selesai terlebih dahulu, lalu menyaring kolom yang dihasilkan dalam lapisan kueri luar.

Pola Pembungkus Kueri Bersarang

Perbaikan standar: hitung fungsi jendela dalam kueri dalam (tabel turunan), beri nama pada hasilnya, lalu saring nama tersebut di WHERE luar.

Tabel turunan harus memiliki nama pengganti (t di sini) — pewawancara memperhatikan kandidat yang melupakannya. Sekarang rn menjadi kolom biasa yang dapat dibandingkan oleh kueri luar.

SELECT *
FROM (
  SELECT
    name, department, salary,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
  FROM employees
) t
WHERE rn = 1;

Pola CTE (Sering Kali Lebih Rapi)

Ekspresi Tabel Umum melakukan hal yang sama dengan struktur yang lebih mudah dibaca. Tentukan pemeringkatan dalam langkah WITH, lalu saring hasilnya dalam kueri utama.

Secara fungsional, cara ini identik dengan kueri bersarang, tetapi pewawancara biasanya lebih menyukai CTE dalam sesi penulisan kode langsung karena maksudnya terbaca dari atas ke bawah.

WITH ranked AS (
  SELECT
    name, department, salary,
    ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
  FROM employees
)
SELECT name, department, salary
FROM ranked
WHERE rn = 1;

Contoh Lengkap: N Teratas per Grup

Masalah fungsi jendela yang paling sering muncul: "3 karyawan bergaji tertinggi per departemen." Lakukan pemeringkatan di dalam CTE, lalu pertahankan rn <= 3 di luarnya.

Pilih fungsi pemeringkatan berdasarkan cara menangani nilai sama: ROW_NUMBER membatasi tepat 3 baris per departemen; gunakan RANK/DENSE_RANK jika nilai sama pada batas harus disertakan.

WITH ranked AS (
  SELECT department, name, salary,
         ROW_NUMBER() OVER (
           PARTITION BY department ORDER BY salary DESC
         ) AS rn
  FROM employees
)
SELECT department, name, salary
FROM ranked
WHERE rn <= 3
ORDER BY department, rn;

Contoh Lengkap: Menyaring Total Berjalan

Pola pembungkus bukan hanya untuk peringkat. Setiap hasil jendela — total berjalan, rata-rata bergerak, atau selisih LAG — harus disaring dengan cara yang sama.

Di sini kita menghitung saldo berjalan, lalu hanya mempertahankan baris saat saldo tersebut pertama kali melampaui 1000. Penyaringan dilakukan di luar lapisan jendela.

WITH balances AS (
  SELECT
    account_id, txn_date, amount,
    SUM(amount) OVER (
      PARTITION BY account_id ORDER BY txn_date
    ) AS running_balance
  FROM transactions
)
SELECT *
FROM balances
WHERE running_balance > 1000;

QUALIFY: Jalan Pintas di Beberapa Basis Data

Snowflake, BigQuery, Teradata, dan DuckDB menyediakan klausa QUALIFY yang menyaring hasil jendela secara langsung — tanpa pembungkus. Klausa ini dijalankan setelah fungsi jendela, tepat di tempat yang Anda perlukan.

Sebutkan QUALIFY untuk menunjukkan keluasan pengetahuan, tetapi catat bahwa klausa ini bukan bagian dari standar SQL dan tidak tersedia di PostgreSQL, MySQL, serta SQL Server, sehingga Anda tetap memerlukan pembungkus kueri bersarang/CTE.

-- Snowflake / BigQuery only:
SELECT department, name, salary
FROM employees
QUALIFY ROW_NUMBER() OVER (
  PARTITION BY department ORDER BY salary DESC
) = 1;

Jangan Keliru Membedakan HAVING dan Penyaringan Jendela

Kandidat terkadang mencoba menggunakan HAVING untuk menyaring peringkat. HAVING menyaring grup setelah agregasi GROUP BY dan tetap dijalankan sebelum fungsi jendela, sehingga klausa ini juga tidak dapat merujuk pada kolom jendela.

  • WHERE → menyaring baris sebelum pengelompokan dan sebelum fungsi jendela.
  • HAVING → menyaring grup teragregasi, tetap sebelum fungsi jendela.
  • Menyaring hasil jendela → memerlukan kueri luar (atau QUALIFY).

Menggabungkan Penyaringan Awal dengan Penyaringan Jendela

Sering kali Anda perlu menyaring sebelum dan sesudah jendela. Terapkan penyaringan baris biasa di WHERE dalam (agar jendela hanya melihat baris yang relevan), lalu saring hasil jendela dalam kueri luar.

Dalam contoh ini, kita terlebih dahulu membatasi data pada karyawan aktif, lalu memilih karyawan bergaji tertinggi di setiap departemen dari kumpulan tersebut. Menempatkan WHERE active di dalam mengubah baris yang diberi peringkat.

WITH ranked AS (
  SELECT department, name, salary,
         ROW_NUMBER() OVER (
           PARTITION BY department ORDER BY salary DESC
         ) AS rn
  FROM employees
  WHERE is_active = true        -- pre-filter before ranking
)
SELECT * FROM ranked
WHERE rn = 1;                   -- post-filter on the window

Catatan Performa

Pewawancara mungkin bertanya apakah pembungkus mengurangi performa. Biasanya tidak: pengoptimal memperlakukan kueri bersarang/CTE sebagai bagian dari satu rencana dan menghitung jendela satu kali. Tidak ada pemindaian tambahan hanya karena Anda membungkusnya.

Satu pengecualian: pada beberapa mesin, CTE dapat menjadi penghalang pengoptimalan (diwujudkan sebagai hasil tersimpan), sehingga untuk jalur kritis, tabel turunan atau QUALIFY mungkin menghasilkan rencana yang lebih baik. Ukur kinerjanya dengan EXPLAIN jika hal ini penting.

Kesalahan Umum

Daftar pemeriksaan akhir:

  • Jangan pernah menempatkan fungsi jendela di WHERE/HAVING — hal itu menimbulkan kesalahan.
  • Selalu beri nama pengganti pada tabel turunan; kueri bersarang tanpa nama dalam FROM akan ditolak.
  • Pilih fungsi pemeringkatan berdasarkan cara menangani nilai sama yang diperlukan oleh pertanyaan.
  • Gunakan QUALIFY hanya jika didukung; jika tidak, gunakan pembungkus CTE/kueri bersarang sebagai cadangan.

Pemeriksaan Cepat

Mengapa penyaringan fungsi jendela memerlukan pembungkus?

Ringkasan: Menyaring Hasil Jendela

Anda telah menuntaskan pembahasan fungsi jendela untuk pemeringkatan:

  • Fungsi jendela dijalankan setelah WHERE/GROUP BY/HAVING, sehingga Anda tidak dapat menyaringnya di sana.
  • Bungkus jendela dalam kueri bersarang atau CTE (selalu beri nama pengganti), lalu saring hasilnya dalam kueri luar.
  • Teknik ini digunakan untuk N teratas per grup, baris terbaru per kunci, dan ambang total berjalan.
  • QUALIFY adalah jalan pintas nonstandar yang praktis, tetapi hanya tersedia di Snowflake/BigQuery.

Sekarang Anda memiliki perangkat lengkap pemeringkatan yang paling sering diuji oleh pewawancara.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Memfilter Hasil Jendela” gratis?

Ya — teks lengkap “Memfilter Hasil Jendela” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Memfilter Hasil Jendela”?

Mengapa Anda harus membungkus fungsi jendela dalam subkueri atau CTE untuk memfilternya. Kamu berlatih Coding Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Coding Interview Prep?

Tidak diperlukan pengalaman sebelumnya. Coding Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Memfilter Hasil Jendela” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Coding Interview Prep ini?

Ya. Setiap pelajaran Coding Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. OVER, PARTITION BY, dan ORDER BY
  2. ROW_NUMBER untuk Pengurutan Unik
  3. RANK vs DENSE_RANK pada Nilai Seri
  4. Memfilter Hasil Jendela
← Kembali ke Coding Interview Prep