Выделить уникальный случайный номер дела SQL 2008 - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть список команд в одной таблице и список дел в другой таблице.Я должен назначить уникальный случайный номер дела каждому члену команды.Каков наилучший способ генерировать уникальный случайный номер случая для каждого члена команды.Я прочитал о функциях NewID () и CRYPT_GEN_RANDOM (4).Я пытался использовать их, но не получил уникальный номер для каждого члена команды.Может кто-нибудь, пожалуйста, помогите мне.Спасибо за ваше время.Я использую SQL 2008.

У меня есть таблица «Команды», в которой есть члены команды, их идентификаторы (TM1, TM2 и т. Д.) И их имена.У меня есть еще одна таблица «Случаи» с идентификационными номерами, такими как 1,2,3,4 и т. Д. Я хочу назначить случайный случай каждому члену команды.Желаемый результат должен быть таким, как показано ниже.

 Team member    Random_case_allocated
      TM1           3
      TM2           5
      TM3           7
      TM4           2
      TM5           8
      TM6           6

Я пытался выбрать SELECT TOP 1 id ИЗ случаев ORDER BY CRYPT_GEN_RANDOM (4)

Он дает одинаковый идентификатор всем членам команды.Я хочу разные идентификаторы для каждого члена команды.Может кто-нибудь, пожалуйста, помогите.Спасибо.

1 Ответ

0 голосов
/ 13 ноября 2018

TOP(1) ORDER BY NEWID() не будет работать так, как вы пытаетесь заставить его работать здесь.TOP сообщает обработчику запросов, что вас интересует только первая запись набора результатов.Вам нужно иметь оценку NEWID() для каждой записи.Вы можете форсировать это внутри оконной функции, такой как ROW_NUMBER ().Я мог бы представить, что это может быть оптимизировано, но это было то, что я мог придумать из головы.Обратите внимание, что это не совсем случайный алгоритм.

ОБНОВЛЕНО с исключениями предыдущего случая

DECLARE @User TABLE(UserId INT)
DECLARE @Case TABLE(CaseID INT)
DECLARE @UserCase TABLE (UserID INT, CaseID INT, DateAssigned DATETIME)

DECLARE @CaseCount INT =10
DECLARE @SaveCaseID INT = @CaseCount
DECLARE @UserCount INT = 100
DECLARE @NumberOfUserAllocatedAtStart INT= 85

WHILE(@CaseCount > 0)BEGIN
    INSERT @Case VALUES(@CaseCount) 
    SET @CaseCount = @CaseCount-1
END

DECLARE @RandomCaseID INT
WHILE(@UserCount > 0)BEGIN
    INSERT @User VALUES(@UserCount) 
    SET @UserCount = @UserCount-1

    IF(@NumberOfUserAllocatedAtStart > 0 )BEGIN
        SET @RandomCaseID = (ABS(CHECKSUM(NewId())) % (@SaveCaseID))+1
        INSERT @UserCase SELECT @UserCount,@RandomCaseID,DATEADD(MONTH,-3,GETDATE())

        SET @RandomCaseID = (ABS(CHECKSUM(NewId())) % (@SaveCaseID))+1
        INSERT @UserCase SELECT @UserCount,@RandomCaseID,DATEADD(MONTH,-5,GETDATE())

        SET @RandomCaseID = (ABS(CHECKSUM(NewId())) % (@SaveCaseID))+1
        INSERT @UserCase SELECT @UserCount,@RandomCaseID,DATEADD(MONTH,-2,GETDATE())

        SET @NumberOfUserAllocatedAtStart=@NumberOfUserAllocatedAtStart-1
    END
END

;WITH RowNumberWithNewID AS
(
    SELECT 
        U.UserID, C.CaseID, UserCase_CaseID = UC.CaseID,
        RowNumber = ROW_NUMBER() OVER (PARTITION BY U.UserID ORDER BY NEWID())
    FROM  
        @User U 
        INNER JOIN @Case C ON 1=1
        LEFT OUTER JOIN @UserCase UC ON  UC.UserID=U.UserID AND UC.CaseID=C.CaseID AND UC.DateAssigned > DATEADD(MONTH, -4, UC.DateAssigned)
    WHERE
        UC.CaseID IS NULL OR UC.CaseID <> C.CaseID
)

SELECT 
    UserID,
    CaseID,
    PreviousCases = STUFF((SELECT ', '+CONVERT(NVARCHAR(10), UC.CaseID) FROM @UserCase UC WHERE UC.UserID=RN.UserID FOR XML PATH('')),1,1,'')
FROM RowNumberWithNewID RN
WHERE
    RN.RowNumber=1
...