我在一个表中有一个团队列表,在另一个表中有一些案例列表。我必须为团队中的每个成员分配一个唯一的随机案例编号。为每个团队成员生成唯一的随机案例编号的最佳方法是什么。我已经阅读了有关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。有人可以帮忙吗?谢谢。
答案 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