Bạn cần tạo một số ngẫu nhiên trên mỗi hàng và tính trọng số của nó.
Trong trường hợp này, RAND(CHECKSUM(NEWID()))
xoay quanh đánh giá "mỗi truy vấn" của RAND
. Sau đó, chỉ cần nhân nó với tăng và ĐẶT HÀNG BẰNG kết quả DESC. SUM..OVER
mang lại cho bạn tổng mức tăng
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
Nếu bạn có các giá trị tăng cực kỳ khác nhau (mà tôi nghĩ bạn đã đề cập), tôi cũng sẽ xem xét sử dụng LOG (là cơ sở e) để phân phối suôn sẻ.
Cuối cùng, ORDER BY NEWID () là một sự ngẫu nhiên sẽ không tính đến việc tăng giá. Nó hữu ích để tạo RAND nhưng không phải tự nó.
Mẫu này được đặt cùng nhau trên SQL Server 2008, BTW