Rumah > pangkalan data > tutorial mysql > SQL RANK() lwn. ROW_NUMBER(): Bilakah Anda Harus Menggunakan Setiap Fungsi?

SQL RANK() lwn. ROW_NUMBER(): Bilakah Anda Harus Menggunakan Setiap Fungsi?

DDD
Lepaskan: 2025-01-13 16:46:43
asal
923 orang telah melayarinya

SQL RANK() vs. ROW_NUMBER(): When Should You Use Each Function?

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

Fungsi

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

Dalam contoh ini, apabila mengisih mengikut ID dalam partition yang sama (StyleID), tiga baris pertama diduakan. Begini cara setiap fungsi mengendalikan nilai pendua ini:

  • ROW_NUMBER() memberikan nilai yang semakin meningkat (1, 2, 3) dan mengabaikan nilai pendua.
  • RANK() memberikan ketiga-tiga baris pendua nilai kedudukan yang sama (1), kemudian melonjak ke 4 untuk nilai berbeza seterusnya.
  • DENSE_RANK() juga memberikan baris pendua nilai kedudukan yang sama (1), tetapi meningkat kepada 2 untuk nilai berbeza seterusnya.

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan