Pemahaman mendalam tentang fungsi RANK() dan ROW_NUMBER() dalam SQL
Fungsi RANK() dan ROW_NUMBER() dalam SQL selalunya mengelirukan dan artikel ini bertujuan untuk menjelaskan perbezaan antara kedua-duanya.
Pertama sekali, perlu diingatkan bahawa jika tiada nilai pendua dalam partition, hasil pertanyaan SQL bagi kedua-dua fungsi ini akan sama. Walau bagaimanapun, apabila nilai pendua muncul, perbezaannya menjadi jelas.
Nilai dan kepastian pendua
FungsiROW_NUMBER() memberikan nilai tambahan yang unik kepada setiap baris dalam partition, walaupun jika baris mempunyai nilai yang sama pada lajur isihan. Ini bermakna ROW_NUMBER() adalah bukan deterministik dan nilai yang diberikannya mungkin berubah sewenang-wenangnya pada setiap pertanyaan.
Sebaliknya, RANK() dan DENSE_RANK() kedua-duanya bersifat deterministik dalam partition. Berbilang baris akan diberikan nilai kedudukan yang sama jika mereka mempunyai nilai yang sama pada kedua-dua lajur pengisihan dan lajur pemisahan.
Contoh
Pertimbangkan contoh 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>
Dalam contoh ini, apabila mengisih mengikut ID dalam partition yang sama (StyleID), tiga baris pertama diduakan. Begini cara setiap fungsi mengendalikan nilai pendua ini:
Kesimpulan
RANK() dan DENSE_RANK() mengekalkan kedudukan yang konsisten dalam partition walaupun dengan adanya nilai pendua. Walau bagaimanapun, ROW_NUMBER() memberikan nilai yang meningkat secara sewenang-wenangnya, yang boleh membawa kepada hasil yang tidak dapat diramalkan. Memahami perbezaan ini akan membantu anda memilih fungsi yang sesuai berdasarkan keperluan SQL khusus anda.
Atas ialah kandungan terperinci SQL RANK() lwn. ROW_NUMBER(): Bilakah Anda Harus Menggunakan Setiap Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!