Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bias acak dalam SQL?

Anda perlu membuat angka acak per baris dan menimbangnya.

Dalam hal ini, RAND(CHECKSUM(NEWID())) mengatasi evaluasi "per kueri" dari RAND . Kemudian cukup kalikan dengan boost dan ORDER BY hasil DESC. SUM..OVER memberi Anda dorongan total

DECLARE @sample TABLE (id int, boost int)

INSERT @sample VALUES (1, 1), (2, 2), (3, 7)

SELECT
    RAND(CHECKSUM(NEWID())) * boost  AS weighted,
    SUM(boost) OVER () AS boostcount,
    id
FROM
    @sample
GROUP BY
    id, boost
ORDER BY
    weighted DESC

Jika Anda memiliki nilai boost yang sangat berbeda (yang saya pikir Anda sebutkan), saya juga akan mempertimbangkan untuk menggunakan LOG (yang merupakan basis e) untuk memperlancar distribusi.

Akhirnya, ORDER BY NEWID() adalah keacakan yang tidak memperhitungkan peningkatan. Ini berguna untuk menyemai RAND tetapi tidak dengan sendirinya.

Sampel ini disatukan di SQL Server 2008, BTW



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tampilkan indeks di tabel MySQL

  2. Temukan Panjang/Lat di dalam poligon dengan MySQL 5.6

  3. Permintaan MySQL berfungsi di phpmyadmin tetapi tidak di php

  4. Bagaimana saya bisa menggunakan $_get dengan fungsi build_categories_options?

  5. Kesalahan saat membuat Pemicu MySQL