- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从一个小表中随机选择 10% 的样本。我想我只需使用 RAND() 函数并选择随机数小于 0.10 的那些行:
SELECT * FROM SomeTable
WHERE SomeColumn='SomeCondition' AND
RAND() < 0.10
但我很快发现 RAND() 总是返回相同的数字!让我想起了这个xkcd cartoon .
好的,没问题,RAND 函数采用种子值。我将定期运行此查询,并且如果我在不同的日期运行它,我希望它给出不同的结果,因此我使用日期和唯一行 ID 的组合来为其播种:
SELECT * FROM SomeTable
WHERE 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 子句应用。带有 NEWID 的 TOP 不起作用,因为我事先不知道我想要多少行。
有人有解决方案,或者至少有提示吗?
编辑:感谢 AlexCuse 提供 solution这适用于我的特殊情况。现在问一个更大的问题,如何让兰德表现出来?
最佳答案
这种类型的方法(由 ΤΖΩΤΖIΟΥ 所示)不能保证 10% 的采样率。它只会为您提供 Rand() 计算结果为 < .10 的所有行,这将不一致。
类似于
select top 10 percent * from MyTable order by NEWID()
就可以了。
编辑:并没有真正让 RAND 表现良好的好方法。这是我过去使用过的(kludge 警报 - 它会杀死你无法在 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
即可。
关于sql - 在 MS SQL Server 2005 中使用 RAND() 时我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/163604/
我是一名优秀的程序员,十分优秀!