Rumah > pangkalan data > tutorial mysql > RANK() lwn. DENSE_RANK() dalam Oracle: Bagaimanakah Fungsi Tetingkap Ini Berbeza dalam Kedudukan dan Mengendalikan Null?

RANK() lwn. DENSE_RANK() dalam Oracle: Bagaimanakah Fungsi Tetingkap Ini Berbeza dalam Kedudukan dan Mengendalikan Null?

Mary-Kate Olsen
Lepaskan: 2025-01-25 00:12:10
asal
194 orang telah melayarinya

RANK() vs. DENSE_RANK() in Oracle: How Do These Window Functions Differ in Ranking and Handling Nulls?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan