PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Изберете произволен ред от PostgreSQL таблица с претеглени вероятности за редове

Това трябва да свърши работа:

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).

[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. Разширено съвпадение на дялове за присъединяване по дял

  2. За предимствата на сортираните пътища

  3. Копирайте структурата на таблицата в нова таблица

  4. Когато автовакуумът не вакуумира

  5. С sqlalchemy как динамично да се свързвате към машината на базата данни на база заявка