首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是为每个记录生成随机数的好方法还是坏方法?

问这是为每个记录生成随机数的好方法还是坏方法?
EN

Stack Overflow用户
提问于 2009-09-16 16:04:41
回答 5查看 1.7K关注 0票数 0

我的一位同事发现了我不知道的SQL Server中的一种行为。

代码语言:javascript
复制
CREATE VIEW dbo.vRandNumber AS
SELECT RAND() as RandNumber
GO

CREATE FUNCTION dbo.RandNumber() RETURNS float AS
RETURN (SELECT RandNumber FROM vRandNumber)
GO

DECLARE @mytable TABLE (id INT)
INSERT INTO @mytable SELECT 1
INSERT INTO @mytable SELECT 2
INSERT INTO @mytable SELECT 3

SELECT *, dbo.RandNumber() FROM @mytable

这似乎是为数据集中的每个记录生成“随机”值的最快方法。但我不完全确定这是记录在案的行为的结果,还是利用了奇怪的巧合。

你会用这样的东西吗?

编辑

这不是关于RAND()函数本身的优点的问题,而是使用UDF/VIEW组合来强制它在每一行上重新计算。(在最终查询中只使用RAND(),而不是dbo.RandNumber(),将为每个记录提供相同的值。)

另外,问题是每次你看它的时候,它的价值都是不同的。例如,允许随机选择记录。

编辑

对于Server 2000+。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-09-16 16:57:18

我不会这样做的软件,我想继续工作的未来版本的Server。我找到了一种方法,可以为select语句中的每一行返回RAND()的不同值。这一发现是一次黑客攻击,2)是在Server 2005上完成的。它不再适用于Server 2008。这种经历使我更加依赖于骗术来获得rand()来返回每行的随机值。

此外,我相信SQL Server可以优化对UDF的多个调用.虽然这可能正在改变,因为它们现在确实允许一些不确定的函数。

仅对于Server 2005,一种强制rand()在select语句中执行每行的方法。不适用于Server 2008。在2005年之前的任何版本上都没有测试:

代码语言:javascript
复制
create table #t (i int)
insert into #t values (1)
insert into #t values (2)
insert into #t values (3)

select i, case when i = 1 then rand() else rand() end as r
from #t

1   0.84923391682467
2   0.0482397143838935
3   0.939738172108974

而且,我知道您说您不是在询问rand()的随机性,但是我会给出一个很好的参考:http://msdn.microsoft.com/en-us/library/aa175776(SQL.80).aspx。它将rand()与newid()和rand(FunctionOf(PK,当前日期时间))进行比较。

票数 3
EN

Stack Overflow用户

发布于 2009-09-16 16:12:34

这取决于你需要什么随机值。它还取决于您需要INTEGER、VARCHAR等中的值的格式。

如果我需要对行进行随机排序,我会执行以下操作

代码语言:javascript
复制
SELECT *
FROM [MyTable]
ORDER BY newID()

同样,您可以使用Server的标识“特性”生成一个ints表,并执行类似的查询,这可能会给出一个随机数。

我的同事每行需要一个随机整数,因此他向我们的表中添加了一个计算字段,这将生成一个在查询中返回的每个行的随机数(整数)。我不确定我是否推荐这样做;它在某些工具中引起了问题,但它为每个表提供了随机整数。然后,我们可以将我的newid()解决方案和那个表结合起来,在需要时得到一组随机数。

所以我回到,它取决于。,你能详细说明你需要什么吗?

Update:下面是表定义片段,我的同事曾经有一个计算过的列,每次查询该表时,每个行返回不同的随机数:

代码语言:javascript
复制
CREATE TABLE [dbo].[Table](
    -- ...
    [OrderID] [smallint] NOT NULL,  --Not sure what happens if this is null
    -- ...
    [RandomizeID]  AS (convert(int,(1000 * rand(([OrderID] * 100 * datepart(millisecond,getdate())))))),
    -- ...
)
票数 1
EN

Stack Overflow用户

发布于 2009-09-16 16:09:48

如果我必须为SQL中的每一行选择一个随机数,那么您可以向我证明RAND()正在生成真正的随机数.

是。我可能会用到类似的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1433915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档