Выберите строки, случайно распределенные вокруг заданного среднего - PullRequest
2 голосов
/ 22 декабря 2010

У меня есть таблица с полем value. Записи имеют значения, несколько равномерно распределенные между 0 и 100.

Я хочу запросить эту таблицу для n записей, учитывая целевое среднее значение, x, чтобы я получил взвешенный случайный набор результатов, где avg(value) будет приблизительно x.

Я мог бы легко сделать что-то вроде

SELECT TOP n * FROM table ORDER BY abs(x - value)

... но это дало бы один и тот же результат каждый раз, когда я запускаю запрос.

Что я хочу сделать, так это добавить какое-то взвешивание, чтобы можно было выбирать любую запись, но с уменьшающейся вероятностью по мере увеличения расстояния от x, чтобы в итоге получилось нечто вроде нормального распределения вокруг моего данного среднего.

Буду признателен за любые предложения относительно того, как мне этого добиться.

Ответы [ 2 ]

2 голосов
/ 22 декабря 2010

почему бы не использовать функцию RAND ()?

SELECT TOP n * FROM table ORDER BY abs(x - value) + RAND()

РЕДАКТИРОВАТЬ

Использование Rand won 'это не работает, потому что вызовы RAND в select имеют тенденцию производить одинаковое число для большинства строк.Шестнадцатеричный был прав в использовании NewID, но его нужно использовать в следующем порядке:

SELECT Top N value  
FROM  table  
ORDER BY
    abs(X - value) + (cast(cast(Newid()  as varbinary) as integer))/10000000000

Большой делитель 10000000000 используется для удержания avg(value) ближе к X при сохранении низкого значения AVG(x-value).

С учетом всего сказанного, возможно, задав вопрос (без битов SQL) на https://stats.stackexchange.com/, вы получите лучшие результаты.

0 голосов
/ 22 декабря 2010

1001 * попробовать *

SELECT TOP n * FROM table ORDER BY abs(x - value),  newid()

или

select * from (
    SELECT TOP n * FROM table ORDER BY abs(x - value)
  ) a order by newid()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...