第一:你觉得我随机的方式怎么样?这样也太穷了吧?
我有一张表 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/