我正在尝试从一张小表中随机选择 10% 的样本。我以为我只是使用 RAND() 函数并选择那些随机数小于 0.10 的行:SELECT * FROM SomeTableWHERE SomeColumn='SomeCondition' AND RAND() < 0.10但我很快发现 RAND() 总是返回相同的数字!让我想起了这个 xkcd cartoon 。好的,没问题,RAND 函数需要一个种子值。我将定期运行这个查询,如果我在不同的日子运行它,我希望它给出不同的结果,所以我用日期和唯一行 ID 的组合来播种它:SELECT * FROM SomeTableWHERE SomeColumn='SomeCondition' AND RAND(CAST(GETDATE) AS INTEGER) + RowID) < 0.10我仍然没有得到任何结果!当我显示 RAND 返回的随机数时,我发现它们都在一个狭窄的范围内。从 RAND 获取随机数似乎需要您使用随机种子。如果我首先有一个随机种子,我就不需要随机数了!我已经看到以前与此问题相关的讨论: SQL Server Random Sort How to request a random row in SQL?他们不帮我。 TABLESAMPLE 在页级别工作,这对大表很好,但对小表不利,而且它看起来像是在 WHERE 子句之前应用。 TOP 和 NEWID 不起作用,因为我不知道我想要多少行。有人有解决方案,或者至少有提示吗? 编辑: 感谢 AlexCuse 提供适用于我的特定情况的 solution。现在到更大的问题,如何让 RAND 表现得更好? 最佳答案 这种类型的方法(由 ΤΖΩΤΖΙΟΥ 所示)不能保证 10% 的抽样。它只会为您提供 Rand() 被评估为 就像是select top 10 percent * from MyTable order by NEWID()会做的伎俩。 编辑: 没有真正让 RAND 表现的好方法。这是我过去使用过的(kludge alert - 它会导致您无法在 UDF 中使用 Rand())CREATE VIEW RandView ASSELECT RAND() AS ValGOCREATE FUNCTION RandomFloat()RETURNS FLOATASBEGINRETURN (SELECT Val FROM RandView)END然后你的查询中只有 select blah, dbo.RandomFloat() from table 。关于sql - 在 MS SQL Server 2005 中使用 RAND() 时我做错了什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/163604/
10-13 05:45