首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用seed的Server随机

使用seed的Server随机
EN

Stack Overflow用户
提问于 2014-09-16 15:07:30
回答 4查看 13.3K关注 0票数 1

我想使用种子向我的表中添加一个随机数的列。如果我使用RAND:

代码语言:javascript
复制
select *, RAND(5) as random_id from myTable

对于random_id列中的所有行,我得到一个相等的值(例如0.943597390424144)。我希望每个行的值都是不同的,而且每次我将传递它的值为0.5 (例如),它将再次是相同的值(因为seed应该工作.)。

我该怎么做?

(例如,在PostrgreSql中,我可以编写

SELECT setseed(0.5); SELECT t.* , random() as random_id FROM myTable t

我将在每一行中得到不同的值。)

编辑:

在我看到这里的评论之后,我设法解决了这个问题--但它根本没有效率。如果有人知道如何改进它,那就太棒了。如果不是-我得另找个办法。

我在这里中使用了示例的基本思想。

创建一个具有空种子值的临时表

代码语言:javascript
复制
select * into t_myTable  from (
select t.*, -1.00000000000000000 as seed
       from myTable t
       ) as temp

为每个种子值添加一个随机数,每次一行(这是不好的部分.):

代码语言:javascript
复制
USE CPatterns;
GO
DECLARE @seed float;
DECLARE @id int;
DECLARE VIEW_CURSOR CURSOR FOR
select id
from t_myTable t;
OPEN VIEW_CURSOR;
FETCH NEXT FROM VIEW_CURSOR
into @id;
set @seed = RAND(5);

WHILE @@FETCH_STATUS = 0
   BEGIN
      set @seed = RAND();
         update t_myTable set seed = @seed where id = @id

      FETCH NEXT FROM VIEW_CURSOR
         into @id;

   END;
CLOSE VIEW_CURSOR;
DEALLOCATE VIEW_CURSOR;
GO

使用种子值创建视图并按其排序

代码语言:javascript
复制
create view my_view AS 
select row_number() OVER (ORDER BY seed, id) AS  source_id ,t.*
       from t_myTable t
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-09-29 10:36:39

所以,万一有一天会有人,这就是我最终所做的。

我在服务器端生成随机种子值(在我的例子中是Java),然后创建一个包含两列的表: id和生成的random_id。现在,我将视图创建为表和原始数据之间的inner join

生成的SQL如下所示:

代码语言:javascript
复制
CREATE TABLE SEED_DATA(source_id INT PRIMARY KEY, random_id float NOT NULL);
select Rand(5); 
insert into SEED_DATA values(1,Rand());
insert into SEED_DATA values(2, Rand());
insert into SEED_DATA values(3, Rand());
.
.
.
insert into SEED_DATA values(1000000, Rand());

代码语言:javascript
复制
CREATE VIEW DATA_VIEW
as  
    SELECT row_number() OVER (ORDER BY random_id, id) AS source_id,column1,column2,...
    FROM 
        ( select * from SEED_DATA tmp 
          inner join my_table i on tmp.source_id = i.id) TEMP 

此外,我在批中创建随机数,每批中大约有10,000个(可能更高),因此它不会对服务器端造成很大的负担,对于每一批,我将它单独地插入到表中。

所有这些都是因为我找不到一种好的方法来实现我想要的纯SQL。逐行更新实际上没有效率。

我从这个故事中得出的结论是,SQL Server有时真的很烦人.

票数 0
EN

Stack Overflow用户

发布于 2014-09-16 15:22:10

我认为在表中获取可重复随机标识的最简单方法是在每一行上使用row_number()或固定的id。让我假设您有一个名为id的列,它在每一行上都有一个不同的值。

这个想法只是把它当作种子:

代码语言:javascript
复制
select rand(id*1), as random_id
from mytable;

请注意,id的种子是整数,而不是浮点数。如果你想要一个浮点种子,你可以用checksum()做一些事情。

代码语言:javascript
复制
select rand(checksum(id*0.5)) as random_id
. . .

如果您这样做是为了抽样(例如对10%的样本使用random_id < 0.1 ),那么我经常在row_number()上使用模块化算法

代码语言:javascript
复制
with t as (
      select t.* row_number() over (order by id) as seqnum
      from mytable t
     )
select *
from t
where ((seqnum * 17 + 71) % 101) < 0.1

这将返回大约10%的数字(好的,实际上是10/101)。你可以通过修改常量来调整样本。

票数 1
EN

Stack Overflow用户

发布于 2019-02-19 17:20:20

有人建议使用newid()进行类似的查询,但我给出了适合我的解决方案。

有一个解决方案涉及newid()而不是rand,但是它给出的结果是相同的。可以单独执行,也可以作为列中的列执行。它将导致每行随机值,而不是select语句中每一行的相同值。如果您需要从0- N随机数,只需更改100为所需的数字.

代码语言:javascript
复制
SELECT TOP 10 [Flag forca]
,1+ABS(CHECKSUM(NEWID())) % 100 AS RANDOM_NEWID
,RAND() AS  RANDOM_RAND
FROM PAGSEGURO_WORK.dbo.jobSTM248_tmp_leitores_iso

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

https://stackoverflow.com/questions/25872332

复制
相关文章

相似问题

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