sql >> Databáze >  >> RDS >> PostgreSQL

Vyberte náhodný řádek z tabulky PostgreSQL s váženými pravděpodobnostmi řádků

Tohle by mělo stačit:

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;

Dílčí dotaz Q dává následující výsledek:

1  50
2  85
3  100

Poté jednoduše vygenerujeme náhodné číslo v rozsahu [0, 100) a vybereme první řádek, který je na tomto čísle nebo za ním (WHERE doložka). Používáme společný tabulkový výraz (WITH ), aby bylo zajištěno, že náhodné číslo bude vypočítáno pouze jednou.

Mimochodem, SELECT SUM(percent) FROM YOUR_TABLE umožňuje mít libovolné váhy v percent – nemusí se nutně jednat o procenta (tj. součet do 100).

[SQL Fiddle]



  1. Jak funguje @@MAX_CONNECTIONS na serveru SQL Server

  2. SQLite Connection uniklo, i když vše bylo uzavřeno

  3. Instalace Perl DBD::Oracle Module

  4. Jak optimalizovat výkon MySQL pomocí MySQLTuner