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

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

Mary-Kate Olsen
Lepaskan: 2025-01-13 16:52:44
asal
642 orang telah melayarinya

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>
Salin selepas log masuk
<code class="language-sql">SELECT ID, [Description], ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) as 'RowNumber' FROM SubStyle</code>
Salin selepas log masuk

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

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

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!

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