2011-12-22 42 views
2

首先:您对我随机的方式有什么看法?这种方式太穷了吗?优化随机T-SQL

我有一个表TABLE_A:

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

id列可以包含alfanumeric值太像 '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行......我想 以避免重复。我赞赏任何建议。

谢谢。

+0

我真的不明白你想要做什么。你想随机化Id值吗?你的意思是你想要50个随机字符? – Lamak 2011-12-22 21:53:05

+0

是的,我想要随机化Id值,但我用ORDER BY RAND(CHECKSUM(NEWID()))来做,但我需要避免重复,如'743432'和'75469',两者都以'7'开始,I不要这样或者我需要减少这种重复,我认为我得到了重复,因为几乎50%的总数是以'7'开头的记录,所以具有这种模式的Ids有更多的概率。 – jlrvpuma 2011-12-22 22:01:52

+0

在这种情况下,您可以使用'NEWID()'作为您的ID。但是如果你想要真正的随机字符可以从1到50,那么你需要一个更复杂的算法 – Lamak 2011-12-22 22:06:34

回答

4

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

最终目标是什么?它看起来像是多次复制一组ID,但是使用那些数据的是什么?可能有更好,更短的路径来实现你想要的。

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

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

+0

ssyladin,谢谢你的回复,我随机编辑了代码2我选择'top 1',我只需要一个记录在结尾,但随机1我尝试混乱,因为数据通常是命令:'1 ***'(n次),'2 ***'(n次),...,'9 *** '(n次)。我从WHILE循环中调用Randomize_sp,因为有时我需要按组来处理。 – jlrvpuma 2011-12-22 22:58:41

+0

你正在使用什么类型的数据库服务器?我所得到的行为与你所描述的不同。我正在测试MS SQL 2008 R2实例。你的位置? – jklemmack 2011-12-23 06:51:01

+0

我也在使用MS SQL 2008 R2实例,该过程的目标是选择优胜者,每次有一个或多个,想象一个彩票,但参与者是cia的雇员。 Id的第一个字符指定一个城市。我尽量避免欺骗,因为当一个城市有更多的雇员时,我会得到更多的城市赢家(欺骗),所以很多人认为随机性很差,所以我认为重构过程虽然我认为这是不公平的,因为如果在一个特定的城市有更多的人,这些人必须有更多的可能性...... – jlrvpuma 2011-12-23 14:16:46