我正在尝试从一张小桌子中随机选择 10% 的样本。我以为我会使用 RAND() 函数并选择随机数小于 0.10 的那些行:
SELECT * FROM SomeTable
WHERE SomeColumn='SomeCondition' AND
RAND() < 0.10
但我很快发现 RAND() 总是返回相同的数字!让我想起了这部xkcd 卡通。
OK,没问题,RAND函数取一个种子值。我将定期运行此查询,如果我在不同的日子运行它,我希望它给出不同的结果,所以我使用日期和唯一行 ID 的组合来播种:
SELECT * FROM SomeTable
WHERE SomeColumn='SomeCondition' AND
RAND(CAST(GETDATE) AS INTEGER) + RowID) < 0.10
我仍然没有任何结果!当我展示 RAND 返回的随机数时,我发现它们都在一个狭窄的范围内。从 RAND 获取随机数似乎需要您使用随机种子。如果我一开始就有随机种子,我就不需要随机数了!
我已经看到了与此问题相关的先前讨论:
SQL Server 随机排序
如何在 SQL 中请求随机行?
他们不帮助我。TABLESAMPLE 在页面级别工作,这对于大表来说非常有用,但对于小表则不适用,而且看起来它适用于 WHERE 子句之前。带有 NEWID 的 TOP 不起作用,因为我不提前知道我想要多少行。
有人有解决方案,或者至少有提示吗?
编辑:感谢 AlexCuse 提供适用于我的特殊情况的解决方案。现在到更大的问题,如何让兰德表现?