Điều này sẽ thực hiện thủ thuật:
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;
Truy vấn phụ Q
cho kết quả sau:
1 50
2 85
3 100
Sau đó, chúng tôi chỉ cần tạo một số ngẫu nhiên trong phạm vi [0, 100) và chọn hàng đầu tiên bằng hoặc ngoài số đó (WHERE
mệnh đề). Chúng tôi sử dụng biểu thức bảng chung (WITH
) để đảm bảo số ngẫu nhiên chỉ được tính một lần.
BTW, SELECT SUM(percent) FROM YOUR_TABLE
cho phép bạn có bất kỳ trọng số nào tính bằng percent
- chúng không nhất thiết phải là tỷ lệ phần trăm (tức là cộng lên 100).
[SQL Fiddle]