यह चाल चलनी चाहिए:
WITH CTE AS (
SELECT random() * (SELECT SUM(percent) FROM YOUR_TABLE) R
)
SELECT *
FROM (
SELECT id, SUM(percent) OVER (ORDER BY id) S, R
FROM YOUR_TABLE CROSS JOIN CTE
) Q
WHERE S >= R
ORDER BY id
LIMIT 1;
उप-क्वेरी Q
निम्नलिखित परिणाम देता है:
1 50
2 85
3 100
हम तब केवल [0, 100) की सीमा में एक यादृच्छिक संख्या उत्पन्न करते हैं और पहली पंक्ति चुनते हैं जो उस संख्या पर या उससे आगे होती है (WHERE
खंड)। हम सामान्य तालिका अभिव्यक्ति का उपयोग करते हैं (WITH
) यह सुनिश्चित करने के लिए कि यादृच्छिक संख्या की गणना केवल एक बार की जाती है।
BTW, SELECT SUM(percent) FROM YOUR_TABLE
आपको percent
. में कोई भार रखने की अनुमति देता है - उन्हें सख्ती से प्रतिशत होने की आवश्यकता नहीं है (यानी 100 तक जोड़ें)।
[एसक्यूएल फिडल]