Rumah >pangkalan data >tutorial mysql >SQL RANK() lwn. ROW_NUMBER(): Apakah Perbezaannya?
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!