2011-12-22 75 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