分配唯一的随机案例编号SQL 2008

时间:2018-11-13 12:32:14

标签: sql-server random sql-server-2008-r2 newid

我在一个表中有一个团队列表,在另一个表中有一些案例列表。我必须为团队中的每个成员分配一个唯一的随机案例编号。为每个团队成员生成唯一的随机案例编号的最佳方法是什么。我已经阅读了有关NewID()和CRYPT_GEN_RANDOM(4)函数的信息。我尝试使用它们,但没有获得每个团队成员的唯一编号。有人可以帮帮我吗。谢谢你的时间。我正在使用SQL 2008。

我有一个“ Teams”表,其中包含团队成员,其ID(TM1,TM2等)及其名称。 我还有另一个“案例”表,其中的ID号为1,2、3、4等。我想为每个团队成员分配随机的案例。所需的输出应如下所示。

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

我尝试过 从案例中选择前1个ID ORDER BY CRYPT_GEN_RANDOM(4)

它为所有团队成员提供相同的ID。我想要每个团队成员使用不同的案例ID。有人可以帮忙吗?谢谢。

1 个答案:

答案 0 :(得分:0)

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