1

У меня есть Profile таблицы со столбцами: UserID, Firstname, LastnameКак я могу генерировать случайные числа из столбца без дубликатов - SQL Server

Я пытаюсь создать хранимую процедуру, которая проходит в параметре @UserID и генерирует 10 случайных чисел, взятых из столбца UserID.

Целью этого является, чтобы позволить одному пользователю отправить сообщение 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.

Edit:

Я думаю, вы также можете использовать TABLESAMPLE() для такого рода вопрос, но я не знаю, как использовать это.

Кстати, если в последовательности идентификаторов (например, 34 пользователя удалено), появляется дыра, вы все равно можете выбрать 34 с помощью своего метода, в то время как методы, берущие образец из таблицы, будут работать.

+0

Благодарим за скорый ответ Jonathon! Я пробовал ваше решение, и он отлично работает. Но я также возьму ваш совет и посмотрю на функцию tablesmple(). Еще раз спасибо, большая помощь! – TreasaNGC