gpt4 book ai didi

sql - 在 MS SQL Server 2005 中使用 RAND() 时我做错了什么?

转载 作者:行者123 更新时间:2023-12-01 23:48:44 25 4
gpt4 key购买 nike

我正在尝试从一个小表中随机选择 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com