Terokai secara mendalam fungsi RANK() dan DENSE_RANK() Oracle
Dalam bidang analisis dan pengisihan data, Oracle menyediakan dua fungsi berbeza: RANK() dan DENSE_RANK(), yang setiap satunya mempunyai kegunaan khusus. Artikel ini akan meneroka perbezaan halus antara kedua-dua fungsi ini dan senario aplikasinya.
Perbandingan RANK() dan DENSE_RANK()
FungsiRANK() memberikan kedudukan kepada baris mengikut susunan yang ditentukan, manakala fungsi DENSE_RANK() menetapkan kedudukan berturut-turut. Sebagai contoh, pertimbangkan senario berikut:
<code class="language-sql">SELECT empname, sal, RANK() OVER (ORDER BY sal) AS r, DENSE_RANK() OVER (ORDER BY sal) AS dr FROM emptbl;</code>
Empname | Sal | r | dr |
---|---|---|---|
rrr | 10000 | 2 | 2 |
nnn | 20000 | 3 | 3 |
mmm | 5000 | 1 | 1 |
kkk | 30000 | 4 | 4 |
fff | 40000 | 5 | 5 |
ddd | 40000 | 5 | 5 |
bbb | 50000 | 7 | 6 |
ccc | 50000 | 7 | 6 |
Dalam contoh ini, walaupun rrr dan nnn mempunyai gaji yang sama, fungsi RANK() memberikan mereka gred yang sama (2), manakala fungsi DENSE_RANK() memberikan gred berturut-turut, memastikan tiada gred dilangkau .
Cari gaji ke-N
Untuk mencari gaji ke-n dalam jadual (contohnya, gaji ketiga tertinggi), anda boleh menggunakan pertanyaan berikut:
<code class="language-sql">SELECT sal FROM emptbl ORDER BY sal DESC LIMIT n-1, 1;</code>
Pengendalian nilai nol
Kelakuan RANK() dan DENSE_RANK() berfungsi apabila menemui nilai nol bergantung pada sama ada NULLS FIRST atau NULLS LAST dinyatakan dalam klausa ORDER BY. Sebagai contoh, pertimbangkan jadual berikut yang mengandungi nilai nol untuk gaji:
<code class="language-sql">SELECT empname, sal, RANK() OVER (PARTITION BY deptno ORDER BY sal NULLS FIRST) AS r, DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal NULLS FIRST) AS dr1 FROM emptbl;</code>
Empname | Sal | r | dr1 |
---|---|---|---|
fff | 40000 | 1 | 1 |
ddd | 40000 | 1 | 1 |
rrr | 10000 | 3 | 2 |
xxx | NULL | 2 | 3 |
Dalam kes ini, nilai nol dianggap mempunyai kedudukan terendah (NULLS FIRST), menghasilkan kedudukan yang berbeza berbanding kes di mana nilai null mempunyai kedudukan tertinggi (NULLS LAST).
Kesimpulan
Fungsi RANK() dan DENSE_RANK() Oracle menyediakan dua kaedah pengisihan data yang berbeza. Memahami perbezaannya dan penggunaan yang sesuai membolehkan anda melakukan analisis data dan tugasan manipulasi dengan berkesan.
Atas ialah kandungan terperinci Apakah perbezaan antara fungsi RANK() dan DENSE_RANK() Oracle, dan bagaimana ia mengendalikan nilai nol?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!