PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chọn hàng ngẫu nhiên từ bảng PostgreSQL với xác suất hàng có trọng số

Đ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]



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự cố kết nối với SQLAlchemy và nhiều quy trình

  2. Kiểu dữ liệu của Postgres NUMERIC có thể lưu trữ các giá trị đã ký không?

  3. Làm thế nào để có được ngày hôm qua trong PostgreSQL

  4. docker postgres pgadmin kết nối cục bộ

  5. CHỌN hoặc THỰC HIỆN trong một hàm PL / pgSQL