0

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

我有一个“团队”表,其中包含团队成员、他们的 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

我试过 SELECT TOP 1 id FROM case ORDER BY CRYPT_GEN_RANDOM(4)

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

4

1 回答 1

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
于 2018-11-13T16:21:50.390 回答