आपको प्रति पंक्ति एक यादृच्छिक संख्या उत्पन्न करने और उसका वजन करने की आवश्यकता है।
इस मामले में, RAND(CHECKSUM(NEWID()))
RAND
. के "प्रति क्वेरी" मूल्यांकन के आसपास हो जाता है . फिर इसे बूस्ट द्वारा गुणा करें और परिणाम डीईएससी द्वारा ऑर्डर करें। SUM..OVER
आपको पूरी तरह से बढ़ावा देता है
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
यदि आपके पास बेतहाशा अलग-अलग बूस्ट मान हैं (जो मुझे लगता है कि आपने उल्लेख किया है), तो मैं वितरण को सुचारू करने के लिए लॉग (जो कि आधार ई है) का उपयोग करने पर भी विचार करूंगा।
अंत में, ORDER BY NEWID() एक यादृच्छिकता है जो बढ़ावा का कोई हिसाब नहीं लेगा। यह रैंड को सीड करने के लिए उपयोगी है लेकिन अपने आप नहीं।
यह नमूना SQL Server 2008, BTW पर एक साथ रखा गया था