Lompati ke konten utama
Modul 7 · Pelajaran 2 dari 426/57 dalam kursus~14 min
Pelajaran modul (2/4)

Fungsi jendela: pemeringkatan dan penghitungan per grup

Fungsi jendela adalah fungsi yang beroperasi pada "grup baris" (jendela_) tetapi — tidak seperti GROUP BY — tidak mengurangi jumlah baris: nilai yang dihitung melalui jendela dilampirkan ke setiap baris hasil akhir.

Ini adalah alat yang tepat untuk menentukan peringkat, penomoran progresif, persentase atas total grup, dan banyak operasi lain yang canggung atau tidak mungkin dengan GROUP BY.

Sintaksnya: function() OVER (…)

SQL
ROW_NUMBER() OVER (PARTITION BY colonna ORDER BY colonna2)

Komponen:

  • PARTITION BY — mendefinisikan "grup" (seperti GROUP BY, tetapi barisnya tetap terpisah);
  • ORDER BY di dalam OVER(…) — menentukan urutan dalam partisi.

OVER () (tanda kurung kosong) berarti "seluruh tabel sebagai satu jendela". Berguna untuk penghitungan seperti "persentase total".

Fungsi peringkat

SQL
ROW_NUMBER() OVER (PARTITION BY p ORDER BY o)
RANK()       OVER (PARTITION BY p ORDER BY o)
DENSE_RANK() OVER (PARTITION BY p ORDER BY o)

Perbedaan (dengan nilai 100, 100, 90, 80):

FungsiPosisi
ROW_NUMBER1, 2, 3, 4 (selalu unik)
RANK1, 1, 3, 4 (ikatan berbagi posisi, meninggalkan "celah")
DENSE_RANK1, 1, 2, 3 (ikatan berbagi posisi, tanpa celah)

Contoh: peringkat produk per kategori

SQL
SELECT name,
       category_id,
       price,
       RANK() OVER (PARTITION BY category_id ORDER BY price DESC) AS rank
FROM   products
ORDER BY category_id, rank;

Untuk setiap category_id RANK dimulai ulang dari 1 dan diurutkan secara menurun harga: Anda mendapatkan peringkat produk dalam setiap kategori, dalam satu kategori ditembak.

Penomoran progresif

SQL
-- Progressive order number for each customer:
SELECT id,
       customer_id,
       ordered_at,
       ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY ordered_at) AS row_num
FROM   orders
ORDER BY customer_id, row_num;

Setiap pesanan pertama pelanggan akan memiliki row_num = 1, pesanan kedua 2, dst.

Cobalah

Latihan#sql.m7.l2.e1
Upaya: 0Memuat…

Untuk setiap produk tampilkan nama, id_kategori, harga dan peringkat (peringkat berdasarkan harga dalam kategori; gunakan PERINGKAT). Urutkan berdasarkan kategori_id menaik dan peringkat menaik.

Memuat editor…
Tunjukkan petunjuk

PARTISI BERDASARKAN grup kategori_id, ORDER BERDASARKAN harga DESC pesanan dalam grup.

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#sql.m7.l2.e2
Upaya: 0Memuat…

Untuk setiap pesanan tampilkan id, id_pelanggan, id_pesanan, dan nomor_baris (ROW_NUMBER progresif per pelanggan, diurutkan dengan naik_at_pesanan). Pesan berdasarkan id_pelanggan dan nomor_baris.

Memuat editor…
Tunjukkan petunjuk

ROW_NUMBER selalu unik dalam partisi.

Solusi tersedia setelah 3 upaya