Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara membuat RAND() Deterministik di SQL Server

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SYSDATETIME() vs GETDATE() di SQL Server:Apa Perbedaannya?

  2. Gunakan SCOPE_IDENTITY() untuk Mengembalikan Nilai Identitas yang Disisipkan Terakhir dalam Lingkup yang Sama (SQL Server)

  3. Mengapa menggunakan karakter Garis Bawah dalam filter LIKE memberi saya semua hasil?

  4. Internal dari Tujuh Jenis SQL Server – Bagian 2

  5. Sisipkan SQL Server jika tidak ada