Как выбрать одну строку, случайным образом принимающую во внимание вес?

Идея FastPass мне похожа на решение для систем, где я должен выполнить задачи 1 через N, и на основе некоторого знания я имею обо мне (в Disney, я мог бы знать, что моими детьми будет много счастливой Испытательной площадки поездки при ожидании Soarin' интервала времени FastPass для прибытия) , я мог запланировать меня, чтобы войти в очередь 'FastPass' для задачи N и также войти в стандартную очередь для задачи M. Это работало бы, где порядок задачи не обязательно важен и где время очереди было известно, и я мог оценить, сколько времени это возьмет, чтобы сделать задачу M или N. Не уверенный у меня есть хороший реальный пример программирования, хотя - большая часть наших взглядов линейна по своей природе и таким образом, наши рабочие процессы имеют тенденцию быть тем путем.

10
задан double-beep 20 May 2019 в 16:03
поделиться

3 ответа

Это работает в MSSQL, и я уверен, что должна быть возможность изменить пару ключевых слов, чтобы они работали и в MySQL (возможно, даже лучше):

SELECT      TOP 1 t.*
FROM        @Table t
INNER JOIN (SELECT      t.id, sum(tt.weight) AS cum_weight
            FROM        @Table t
            INNER JOIN  @Table tt ON  tt.id <= t.id
            GROUP BY    t.id) tc
        ON  tc.id = t.id,
           (SELECT  SUM(weight) AS total_weight FROM @Table) tt,
           (SELECT  RAND() AS rnd) r
WHERE       r.rnd * tt.total_weight <= tc.cum_weight
ORDER BY    t.id ASC

Идея состоит в том, чтобы иметь совокупный вес для каждой строки (подвыбор-1) , затем найдите положение составного RAND () в этом совокупном диапазоне.

2
ответ дан 4 December 2019 в 04:21
поделиться

Может быть, этот:

SELECT * FROM <Table> T JOIN (SELECT FLOOR(MAX(ID)*RAND()) AS ID FROM <Table> ) AS x ON T.ID >= x.ID LIMIT 1;

Или этот:

SELECT * FROM tablename
          WHERE somefield='something'
          ORDER BY RAND() LIMIT 1
-1
ответ дан 4 December 2019 в 04:21
поделиться

Я не помню, как использовать RND () в mysql, но здесь рабочий пример для MSSQL:

SELECT TOP(1) (weight +RAND ()) r, id, content, weight FROM Table
ORDER BY 1 DESC

Если TOP (1) не применим, вы просто выбираете первую запись из общего набора результатов .

-4
ответ дан 4 December 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: