选择围绕给定平均值随机分布的行

时间:2010-12-22 15:16:46

标签: tsql sql-server-2008

我有一个有value字段的表格。记录的值在0到100之间有些均匀分布。

我希望在给定目标均值n的情况下查询此表中的x条记录,以便我会收到一个加权随机结果集,其中avg(value)大约为{{} 1}}。

我可以轻松做点像

x

...但每次运行查询时,这都会给我相同的结果。

我想要做的是添加某种加权,以便可以选择任何记录,但随着与SELECT TOP n * FROM table ORDER BY abs(x - value) 的距离的增加,概率会降低,这样我最终会得到像围绕我的平均值正常分布。

我很感激有关如何实现这一目标的任何建议。

2 个答案:

答案 0 :(得分:2)

为什么不使用RAND()函数?

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

修改

使用Rand将无法正常工作,因为在选择中对RAND的调用倾向于为大多数行生成相同的数字。 Heximal使用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)低。

据说所有人都说https://stats.stackexchange.com/上的问题(没有SQL位)会得到更好的结果。

答案 1 :(得分:0)

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