Mar*_*som 3 sql sql-server random
我正试图从一张小桌子中随机抽取10%的样本.我以为我只是使用RAND()函数并选择随机数小于0.10的那些行:
SELECT * FROM SomeTable
WHERE SomeColumn='SomeCondition' AND
RAND() < 0.10
Run Code Online (Sandbox Code Playgroud)
但我很快发现RAND()总是返回相同的数字!让我想起这个xkcd卡通片.

没问题,RAND函数采用种子值.我将定期运行此查询,如果我在不同的日子运行它,我希望它给出不同的结果,所以我使用日期和唯一行ID的组合来播种它:
SELECT * FROM SomeTable
WHERE SomeColumn='SomeCondition' AND
RAND(CAST(GETDATE) AS INTEGER) + RowID) < 0.10
Run Code Online (Sandbox Code Playgroud)
我还是没有得到任何结果!当我显示RAND返回的随机数时,我发现它们都在一个狭窄的范围内.从RAND获取随机数似乎需要您使用随机种子.如果我首先有一个随机种子,我就不需要随机数!
我已经看到之前有关此问题的讨论:
他们没帮我.TABLESAMPLE在页面级别工作,这适用于大表,但不适用于小表,并且看起来它适用于WHERE子句之前.TOP with NEWID不起作用,因为我不知道我想要多少行.
任何人都有解决方案,或者至少有一个提示?
编辑:感谢AlexCuse提供适用于我的特定案例的解决方案.现在更大的问题,如何使兰德表现?
这种方法(由ΤΖΩΤΖΙΟΥ显示)不能保证10%的采样.它只会向你提供Rand()被评估为<.10的所有行,这些行不一致.
就像是
select top 10 percent * from MyTable order by NEWID()
Run Code Online (Sandbox Code Playgroud)
会做的.
编辑:没有一个很好的方法让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
Run Code Online (Sandbox Code Playgroud)
然后你就可以select blah, dbo.RandomFloat() from table查询了.
| 归档时间: |
|
| 查看次数: |
3517 次 |
| 最近记录: |