RAND()
fungsi di SQL Server mengembalikan nilai float pseudo-acak dari 0 hingga 1, eksklusif.
Fungsi ini dapat bersifat deterministik atau nondeterministik, bergantung pada cara pemanggilannya.
Fungsi deterministik selalu mengembalikan hasil yang sama untuk sekumpulan nilai input tertentu dan diberikan status database yang sama. Fungsi nondeterministik dapat mengembalikan hasil yang berbeda dengan kumpulan nilai input yang sama dan bahkan jika status database tetap sama.
RAND()
fungsi dapat dipanggil dengan dua cara; dengan biji, dan tanpa biji. Jika Anda menyebutnya tanpa benih, itu nondeterministik. Jika Anda menyebutnya dengan benih, itu deterministik.
Dengan kata lain, untuk nilai benih yang ditentukan, hasil yang dikembalikan selalu sama.
Tapi ada kendala:Terkadang memanggil RAND()
tanpa benih adalah deterministik. Saya jelaskan di bawah ini.
Sintaks
Pertama, inilah sintaksnya:
RAND ( [ seed ] )
Tanda kurung siku berarti bahwa argumen seed adalah opsional.
Contoh 1 – Tanpa Biji
Di sini saya memanggil RAND()
lima kali tanpa biji.
SELECT RAND() AS [No Seed] UNION ALL SELECT RAND() UNION ALL SELECT RAND() UNION ALL SELECT RAND() UNION ALL SELECT RAND()
Hasil:
+-------------------+ | No Seed | |-------------------| | 0.2054995913191 | | 0.821844434880088 | | 0.4204955495022 | | 0.286702661673299 | | 0.394385747185196 | +-------------------+
Setiap baris memiliki nilai yang berbeda.
Contoh 2 – Dengan Benih
Di sini saya menjalankan kueri yang sama, kecuali saya menambahkan benih yang sama ke setiap panggilan fungsi.
SELECT RAND(100) AS [With Seed] UNION ALL SELECT RAND(100) UNION ALL SELECT RAND(100) UNION ALL SELECT RAND(100) UNION ALL SELECT RAND(100)
Hasil:
+-------------------+ | With Seed | |-------------------| | 0.715436657367485 | | 0.715436657367485 | | 0.715436657367485 | | 0.715436657367485 | | 0.715436657367485 | +-------------------+
Dalam hal ini, semua baris memiliki nilai yang sama.
Contoh 3 – Menggabungkan Seed dan No Seed dalam Query yang Sama (Beberapa Panggilan RAND())
Anda harus berhati-hati saat memanggil RAND()
beberapa kali dalam koneksi yang sama. Jika Anda memanggil RAND()
dengan nilai benih yang ditentukan, semua panggilan berikutnya dari RAND()
menghasilkan hasil berdasarkan RAND()
. yang diunggulkan panggilan.
Jadi Anda dapat secara tidak sengaja berpikir bahwa Anda sedang menjalankan RAND()
secara nondeterministik padahal sebenarnya tidak.
Berikut ini contoh untuk didemonstrasikan.
SELECT RAND(100) AS [With Seed], RAND() AS [No Seed], RAND() AS [No Seed] UNION ALL SELECT RAND(100) AS [With Seed], RAND() AS [No Seed], RAND() AS [No Seed] UNION ALL SELECT RAND(100) AS [With Seed], RAND() AS [No Seed], RAND() AS [No Seed];
Hasil:
+-------------------+------------------+--------------------+ | With Seed | No Seed | No Seed | |-------------------+------------------+--------------------| | 0.715436657367485 | 0.28463380767982 | 0.0131039082850364 | | 0.715436657367485 | 0.28463380767982 | 0.0131039082850364 | | 0.715436657367485 | 0.28463380767982 | 0.0131039082850364 | +-------------------+------------------+--------------------+
Meskipun nilai yang dihasilkan berbeda di seluruh kolom, setiap panggilan “tanpa benih” sebenarnya didasarkan pada panggilan “dengan benih”, dan oleh karena itu, bersifat deterministik.
Jika saya mengacak panggilan fungsi, inilah yang saya dapatkan.
SELECT RAND() AS [No Seed], RAND() AS [No Seed], RAND(100) AS [With Seed] UNION ALL SELECT RAND() AS [No Seed], RAND() AS [No Seed], RAND(100) AS [With Seed] UNION ALL SELECT RAND() AS [No Seed], RAND() AS [No Seed], RAND(100) AS [With Seed];
Hasil:
+------------------+--------------------+-------------------+ | No Seed | No Seed | With Seed | |------------------+--------------------+-------------------| | 0.28769876521071 | 0.100505471175005 | 0.715436657367485 | | 0.28463380767982 | 0.0131039082850364 | 0.715436657367485 | | 0.28463380767982 | 0.0131039082850364 | 0.715436657367485 | +------------------+--------------------+-------------------+