首先:您对我随机的方式有什么看法?这种方式太穷了吗?优化随机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行......我想 以避免重复。我赞赏任何建议。
谢谢。
我真的不明白你想要做什么。你想随机化Id值吗?你的意思是你想要50个随机字符? – Lamak 2011-12-22 21:53:05
是的,我想要随机化Id值,但我用ORDER BY RAND(CHECKSUM(NEWID()))来做,但我需要避免重复,如'743432'和'75469',两者都以'7'开始,I不要这样或者我需要减少这种重复,我认为我得到了重复,因为几乎50%的总数是以'7'开头的记录,所以具有这种模式的Ids有更多的概率。 – jlrvpuma 2011-12-22 22:01:52
在这种情况下,您可以使用'NEWID()'作为您的ID。但是如果你想要真正的随机字符可以从1到50,那么你需要一个更复杂的算法 – Lamak 2011-12-22 22:06:34