Rumah >pangkalan data >tutorial mysql >SQL RANK() lwn. ROW_NUMBER(): Bagaimanakah Ia Berbeza Apabila Mengendalikan Baris Terikat?

SQL RANK() lwn. ROW_NUMBER(): Bagaimanakah Ia Berbeza Apabila Mengendalikan Baris Terikat?

Patricia Arquette
Patricia Arquetteasal
2025-01-13 17:01:42829semak imbas

SQL RANK() vs. ROW_NUMBER(): How Do They Differ When Handling Tied Rows?

Perbezaan antara SQL RANK() dan ROW_NUMBER()

Perbezaan antara fungsi RANK() dan ROW_NUMBER() dalam SQL sering mengelirukan pembangun. Walaupun pernyataan pertanyaan SQL yang disediakan mungkin kelihatan menghasilkan hasil yang sama pada mulanya, ia akan dijalankan secara berbeza dengan kehadiran nilai yang sama.

Selami perbezaannya

Perbezaan utama antara fungsi RANK() dan ROW_NUMBER() ialah cara ia mengendalikan nilai yang sama. RANK() dan fungsi DENSE_RANK() yang sepadan mempamerkan tingkah laku deterministik. Apabila berbilang baris mempunyai nilai yang sama pada lajur pemisahan dan pengisihan, ia diberikan kedudukan yang sama.

Sebaliknya, ROW_NUMBER() memberikan nilai hasil yang semakin meningkat walaupun untuk baris dengan nilai yang sama. Tingkah laku ini bukan deterministik, yang bermaksud bahawa susunan baris yang sama dalam set hasil mungkin berubah sewenang-wenangnya.

Contoh penerangan

Pertimbangkan senario berikut: semua baris berkongsi StyleID yang sama, membentuk partition. Dalam partition ini, tiga baris pertama adalah setara apabila diisih mengikut ID.

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

Hasil keluaran adalah seperti berikut:

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

Seperti yang anda lihat, ROW_NUMBER() memberikan nilai berangka kepada baris yang sama secara berperingkat, manakala RANK() dan DENSE_RANK() memberikan kedudukan yang sama kepada ketiga-tiga baris yang sama. DENSE_RANK() berkelakuan seperti RANK(), tetapi ia memberikan nilai berbeza seterusnya 2 kepada baris berikutnya untuk mengelakkan jurang dalam urutan kedudukan.

Atas ialah kandungan terperinci SQL RANK() lwn. ROW_NUMBER(): Bagaimanakah Ia Berbeza Apabila Mengendalikan Baris Terikat?. 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