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 (…)
ROW_NUMBER() OVER (PARTITION BY colonna ORDER BY colonna2)Komponen:
PARTITION BY— mendefinisikan "grup" (sepertiGROUP BY, tetapi barisnya tetap terpisah);ORDER BYdi dalamOVER(…)— menentukan urutan dalam partisi.
OVER () (tanda kurung kosong) berarti "seluruh tabel sebagai satu jendela".
Berguna untuk penghitungan seperti "persentase total".
Fungsi peringkat
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):
| Fungsi | Posisi |
|---|---|
ROW_NUMBER | 1, 2, 3, 4 (selalu unik) |
RANK | 1, 1, 3, 4 (ikatan berbagi posisi, meninggalkan "celah") |
DENSE_RANK | 1, 1, 2, 3 (ikatan berbagi posisi, tanpa celah) |
Contoh: peringkat produk per kategori
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
-- 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
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.
Tunjukkan petunjuk
PARTISI BERDASARKAN grup kategori_id, ORDER BERDASARKAN harga DESC pesanan dalam grup.
Solusi tersedia setelah 3 upaya
Tinjau latihan
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.
Tunjukkan petunjuk
ROW_NUMBER selalu unik dalam partisi.
Solusi tersedia setelah 3 upaya