当前位置:  开发笔记 > 编程语言 > 正文

在MS SQL Server 2005中使用RAND()时我做错了什么?

如何解决《在MSSQLServer2005中使用RAND()时我做错了什么?》经验,为你挑选了1个好方法。

我正试图从一张小桌子中随机抽取10%的样本.我以为我只是使用RAND()函数并选择随机数小于0.10的那些行:

SELECT * FROM SomeTable
WHERE SomeColumn='SomeCondition' AND
      RAND() < 0.10

但我很快发现RAND()总是返回相同的数字!让我想起这个xkcd卡通片.

没问题,RAND函数采用种子值.我将定期运行此查询,如果我在不同的日子运行它,我希望它给出不同的结果,所以我使用日期和唯一行ID的组合来播种它:

SELECT * FROM SomeTable
WHERE SomeColumn='SomeCondition' AND
      RAND(CAST(GETDATE) AS INTEGER) + RowID) < 0.10

我还是没有得到任何结果!当我显示RAND返回的随机数时,我发现它们都在一个狭窄的范围内.从RAND获取随机数似乎需要您使用随机种子.如果我首先有一个随机种子,我就不需要随机数!

我已经看到之前有关此问题的讨论:

SQL Server随机排序
如何在SQL中请求随机行?

他们没帮我.TABLESAMPLE在页面级别工作,这适用于大表,但不适用于小表,并且看起来它适用于WHERE子句之前.TOP with NEWID不起作用,因为我不知道我想要多少行.

任何人都有解决方案,或者至少有一个提示?

编辑:感谢AlexCuse提供适用于我的特定案例的解决方案.现在更大的问题,如何使兰德表现?



1> AlexCuse..:

这种方法(由ΤΖΩΤΖΙΟΥ显示)不能保证10%的采样.它只会向你提供Rand()被评估为<.10的所有行,这些行不一致.

就像是

select top 10 percent * from MyTable order by NEWID()

会做的.

编辑:没有一个很好的方法让RAND表现出来.这就是我过去使用过的(kludge alert - 它让你无法在UDF中使用Rand())

CREATE VIEW RandView AS 

SELECT RAND() AS Val

GO

CREATE FUNCTION RandomFloat()
RETURNS FLOAT
AS
BEGIN

RETURN (SELECT Val FROM RandView)

END

然后你就可以select blah, dbo.RandomFloat() from table查询了.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有