2

第一:你觉得我随机的方式怎么样?这样是不是太穷了。。

我有一个表 TABLE_A:

 id       | name      |  state
 ---------------------|----------
 1703248  | blablabla | 1
 ...      | blablabla | 0
 7873415  | blablabla | 1
 7926033  | blablabla | 1

id 列也可以包含字母数字值,例如“zxg-76354GH-34347”。嗯,我有 3060 条记录。

细节:

 select count(1) from TABLE_A where id like 'n%'

如果:

n=1 ---> 201 records , n=2 ---> 147 records , n=3 ---> 187 records
n=4 ---> 327 records , n=5 ---> 430 records , n=6 ---> 503 records
n=7 ---> 1175 records , n=8 ---> 35 records , n=9 ---> 55 records

我随机化的存储过程:

 --Name: Randomize_sp
 BEGIN
 DECLARE @temp table(id varchar(50))
 --RANDOM 1
 INSERT INTO @temp
 SELECT id FROM TABLE_A 
 WHERE state > 0
 ORDER BY RAND(CHECKSUM(NEWID()))
 --RANDOM 2
 SELECT top 1 id FROM @temp ORDER BY RAND(CHECKSUM(NEWID()))
 END

我多次或“n”次调用该存储过程(我需要这样做):

 BEGIN
 DECLARE @nTimes int, @i int
 DECLARE @tempT table(id varchar(50))
 SET @nTimes = 12
 SET @i = 0
 WHILE @i < @nTimes
   BEGIN
   INSERT INTO @tempT
   EXECUTE MyDB.dbo.Randomize_sp
   SET @i = @i + 1
   END
   SELECT id FROM @tempT
 END

问题是:我总是得到以“7”开头的 4 或 5 行,有时我得到以“5”开头的 3 或 2 行......我想避免重复。我赞赏任何建议。

谢谢。

4

1 回答 1

4

我想你不知道“随机”是什么意思。在这种情况下,您有大约 3000 条记录,但其中 1175 条以“7”开头。纯粹的统计数据表明,大约 33% 的时间你会得到一个“7”。你会经常被骗。对于 Lamak 的评论,如果您想明确避免受骗,您将需要一个更复杂的算法,并且根据您的数据,可能无法避免受骗。

最终目标是什么?看起来您正在多次复制一组 ID,但这些数据是用来做什么的?可能有更好、更短的路径来实现你想要的。

其他评论:您对 RAND(CHECKSUM(NEWID())) 的使用让我感到困惑。如果您只是调用 RAND(),它将使用系统时间戳随机播种。对于海量数据建模之外的任何应用程序来说,这已经足够“随机”了。

另外,你为什么在 Randomize_sp 中“随机化”两次?首先,从数据库中选择所有“state > 0”行到一个临时表中,然后从临时表中选择所有内容。您不能“增加”随机性,因此最好只返回原始数据集,而不是先将其放入 @table 变量中。

于 2011-12-22T22:24:13.320 回答