我正试图从一张小桌子中随机抽取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提供适用于我的特定案例的解决方案.现在更大的问题,如何使兰德表现?
这种方法(由ΤΖΩΤΖΙΟΥ显示)不能保证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
查询了.