Oracle RANK() dan DENSE_RANK(): Analisis Perbandingan Fungsi Tetingkap
Oracle RANK()
dan DENSE_RANK()
ialah fungsi tetingkap yang digunakan untuk menetapkan kedudukan pada baris dalam partition tertentu. Walaupun kedua-duanya mencapai matlamat yang sama, pengendalian hubungan dan nilai NULL mereka berbeza dengan ketara.
RANK()
Fungsi
RANK()
memberikan pangkat berdasarkan susunan yang ditentukan. Yang penting, ia memberikan pangkat sama kepada baris yang terikat dan kemudian langkau kedudukan. Sebagai contoh, jika tiga baris diikat untuk tempat kedua, mereka semua akan menerima pangkat 2 dan kedudukan seterusnya ialah 5.
DENSE_RANK()
Fungsi
Tidak seperti RANK()
, DENSE_RANK()
memberikan kedudukan berturut-turut tanpa jurang, walaupun dengan seri. Semua baris yang terikat menerima pangkat yang sama, dan pangkat berikutnya serta-merta mengikuti. Tiada pangkat yang dilangkau.
Mendapatkan Gaji Tertinggi ke-1
Untuk mengenal pasti gaji ke-n tertinggi daripada jadual emptbl
, anda boleh menggaji sama ada RANK()
atau DENSE_RANK()
dalam klausa OVER()
:
<code class="language-sql">SELECT empname, sal FROM ( SELECT empname, sal, RANK() OVER (ORDER BY sal DESC) AS rnk -- Note: ORDER BY sal DESC for nth highest FROM emptbl ) WHERE rnk = n;</code>
Mengendalikan Nilai NULL
Perlakuan nilai NULL oleh kedua-dua fungsi ditentukan oleh klausa ORDER BY
. Jika NULLS FIRST
ditentukan, NULL ditarafkan sebelum nilai bukan NULL; jika NULLS LAST
, mereka berada di kedudukan selepas.
Contoh Ilustrasi
Mari kita periksa skrip berikut:
<code class="language-sql">WITH q AS ( SELECT 10 AS DEPTNO, 'rrr' AS EMPNAME, 10000.00 AS SAL FROM DUAL UNION ALL SELECT 11, 'nnn', 20000.00 FROM DUAL UNION ALL SELECT 11, 'mmm', 5000.00 FROM DUAL UNION ALL SELECT 12, 'kkk', 30000 FROM DUAL UNION ALL SELECT 10, 'fff', 40000 FROM DUAL UNION ALL SELECT 10, 'ddd', 40000 FROM DUAL UNION ALL SELECT 10, 'bbb', 50000 FROM DUAL UNION ALL SELECT 10, 'xxx', NULL FROM DUAL UNION ALL SELECT 10, 'ccc', 50000 FROM DUAL ) SELECT EMPNAME, DEPTNO, 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, DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL NULLS LAST) AS DR2 FROM q;</code>
Hasilnya jelas menunjukkan kelakuan kontras RANK()
dan DENSE_RANK()
apabila mengendalikan nilai NULL, bergantung pada spesifikasi NULLS FIRST
atau NULLS LAST
dalam klausa ORDER BY
. Contoh ini menyerlahkan kepentingan memahami nuansa ini apabila memilih fungsi penarafan yang sesuai untuk keperluan khusus anda.
Atas ialah kandungan terperinci RANK() lwn. DENSE_RANK() dalam Oracle: Bagaimanakah Fungsi Tetingkap Ini Berbeza dalam Kedudukan dan Mengendalikan Null?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!