Rumah >pangkalan data >tutorial mysql >SQL RANK() lwn. ROW_NUMBER(): Bagaimanakah Ia Berbeza Apabila Mengendalikan Baris Terikat?
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!