t-sql - 优化随机 T-SQL

标签 t-sql random newid

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

我有一张表 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

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

谢谢。

最佳答案

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

最终目标是什么?看起来您多次重复了某些 ID 集,但是这些数据有何用途呢?可能有一条更好、更短的路径来实现您想要的目标。

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

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

关于t-sql - 优化随机 T-SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8610075/

相关文章:

sql - T-SQL员工层次结构递归查询

c# - 在 C# 中随机重新排列项目列表的最佳方法是什么?

image - 获取测试脚本的随机图像

sql-server - NEWID() 和 PERSISTED 计算列的结果不一致

sql - 从已经严格格式化的 SQL 日期时间字符串中提取日期作为 UNIX 时间戳

sql-server - 以多种方式在 SQL 查询中多次使用复杂语句

sql - 代码长度与组织

C# 二维数组值替换

sql-server - "order by newid()"- 它是如何工作的?

sql - 在现有表上将 newid() 更改为 newsequentialid()