Rumah >pangkalan data >tutorial mysql >SQL RANK() lwn. ROW_NUMBER(): Apakah Perbezaannya?

SQL RANK() lwn. ROW_NUMBER(): Apakah Perbezaannya?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-13 16:52:44601semak imbas

SQL RANK() vs. ROW_NUMBER(): What's the Difference?

Perbezaan antara SQL RANK() dan ROW_NUMBER()

Apabila menggunakan fungsi ranking SQL, adalah penting untuk memahami perbezaan antara RANK() dan ROW_NUMBER(). Walaupun mereka mungkin kelihatan serupa dalam beberapa kes, mereka mungkin berkelakuan berbeza apabila berurusan dengan nilai pendua.

Perbandingan ROW_NUMBER() dan RANK()

ROW_NUMBER() memberikan nilai integer berturut-turut kepada setiap baris, tidak kira sama ada nilai dalam lajur pengisihan adalah sama. Ini bermakna ROW_NUMBER() akan sentiasa memberikan integer unik kepada setiap baris.

RANK(), sebaliknya, memberikan kedudukan kepada setiap baris berdasarkan susunan disusun baris dalam partition. Baris dengan nilai isihan yang sama akan menerima pangkat yang sama. Apabila seri berlaku, ini mengakibatkan jurang dalam kedudukan.

Demo

Pertanyaan SQL berikut menunjukkan perbezaan antara ROW_NUMBER() dan RANK():

<code class="language-sql">SELECT ID, [Description], RANK() OVER(PARTITION BY StyleID ORDER BY ID) as 'Rank' FROM SubStyle</code>
<code class="language-sql">SELECT ID, [Description], ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) as 'RowNumber' FROM SubStyle</code>

Menggunakan pertanyaan ini, kedua-dua set hasil pada mulanya kelihatan sama. Walau bagaimanapun, jika terdapat sebarang seri dalam kedudukan, perbezaannya menjadi jelas. Pertimbangkan contoh data berikut:

<code class="language-sql">WITH T(StyleID, ID)
AS (SELECT 1,1 UNION ALL
    SELECT 1,1 UNION ALL
    SELECT 1,1 UNION ALL
    SELECT 1,2)
SELECT *,
RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS [RANK],
ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS [ROW_NUMBER],
DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS [DENSE_RANK]
FROM T</code>

Keputusan:

<code>StyleID     ID       RANK      ROW_NUMBER      DENSE_RANK
----------- -------- --------- --------------- ----------
1           1        1         1               1
1           1        1         2               1
1           1        1         3               1
1           2        4         4               2</code>

Dalam contoh ini, ROW_NUMBER() akan meningkat walaupun terdapat seri, manakala RANK() akan menetapkan kedudukan yang sama kepada semua baris yang terikat. DENSE_RANK() adalah seperti RANK(), tetapi memberikan kedudukan berbeza seterusnya (2) kepada nilai kedudukan berbeza seterusnya.

Atas ialah kandungan terperinci SQL RANK() lwn. ROW_NUMBER(): Apakah Perbezaannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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