PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wybierz losowy wiersz z tabeli PostgreSQL z ważonymi prawdopodobieństwami wierszy

To powinno wystarczyć:

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;

Zapytanie podrzędne Q daje następujący wynik:

1  50
2  85
3  100

Następnie po prostu generujemy losową liczbę z zakresu [0, 100) i wybieramy pierwszy wiersz, który jest równy lub większy od tej liczby (WHERE klauzula). Używamy wspólnego wyrażenia tabelowego (WITH ), aby liczba losowa była obliczana tylko raz.

BTW, SELECT SUM(percent) FROM YOUR_TABLE pozwala mieć dowolne wagi w percent - nie muszą być ściśle wartościami procentowymi (tj. dodają do 100).

[Skrzypce SQL]



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 7 najlepszych wskazówek dotyczących zbiorczego ładowania danych PostgreSQL

  2. PostgreSQL:jaki typ danych powinien być używany dla waluty?

  3. postgresql migracja JSON do JSONB

  4. Postgres właśnie losowo przestał działać (Rails, PGSQL.5432)

  5. Radzenie sobie z powolnymi zapytaniami w PostgreSQL