1

我有一個Profile表列:UserIDFirstnameLastname如何生成從列隨機數字,沒有重複 - SQL服務器

我想創造出通過在@UserID參數的存儲過程,並從UserID列中生成10個隨機數。

這樣做的目的是爲了讓一個用戶將消息發送給10個隨機用戶(沒有任何重複)

以下是我迄今爲止:

CREATE PROCEDURE [dbo].[Random10] 
@UserID INT 
AS 
DECLARE @MaxID INT, @MinID INT, @RandomID INT, @Index INT 

SET @MinID = (SELECT MIN(P.UserID) FROM Profile P) 
SET @MaxID = (SELECT MAX(P.UserID) FROM Profile P) 
SET @Index = 0 

CREATE TABLE #RandomUsers 
(
ID INT PRIMARY KEY IDENTITY, 
UserID INT 
) 


WHILE @Index < 10 
BEGIN 
    SELECT @RandomID = ROUND(((@MaxID - @MinID - 1) * RAND() + @MinID), 0) 

    IF (@RandomID <> @UserID) 
    BEGIN 
     INSERT INTO #RandomUsers VALUES (@RandomID) 
     SET @Index = @Index + 1 
    END 
ELSE 
    BEGIN 
     SET @Index = @Index 
    END 
END 

SELECT * FROM #RandomUsers 

我傳遞UserID'66'並使用'WHILE LOOP'和'RAND()'生成10個數字。該「IF」語句用來消除出現在列表中的「@UserID」參數(因爲這將是發送郵件的用戶)

下面是結果:

|ID|UserID| 
| 1| 66| 
| 2| 80| 
| 3| 66| 
| 4| 64| 
| 5| 14| 
| 6| 72| 
| 7| 72| 
| 8| 81| 
| 9| 19| 
|10| 56| 

,你可以看到有一些重複。

我試圖添加一個WHERE子句來消除這兩個問題,但我然後得到一個返回的NULL集。

回答

3

()你可以嘗試使用NEWID:

INSERT INTO #RandomUsers 
Select TOP 10 userId From Profile WHERE userId <> @UserID 
ORDER BY newid() 

這樣,你得到的是不是你在參數中傳遞的一個十個不同的用戶。但我不知道如何在SQL Server中獲得非常好的隨機性。

編輯:

我想你也可以使用TABLESAMPLE()這類問題,但我真的不知道如何使用這個。順便說一句,如果一個洞出現在id序列中(像用戶34被刪除),你仍然可以用你的方法選擇34,而直接從表中取樣的方法仍然可以工作。

+0

謝謝你的快速答案Jonathon!我已經嘗試過你的解決方案,它完美的工作。但我也會接受你的建議,並研究'tablesample()'函數。 再次感謝您的幫助! – TreasaNGC