【问题标题】:Allocate Unique Random case number SQL 2008分配唯一随机案例编号 SQL 2008
【发布时间】:2018-11-13 12:32:14
【问题描述】:

我在一个表格中有一个团队列表,在另一个表格中有一个案例列表。我必须为团队中的每个成员分配一个唯一的随机案例编号。为每个团队成员生成唯一随机案例编号的最佳方法是什么。我已阅读有关 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

我试过了 从案例中选择前 1 个 ID 按 CRYPT_GEN_RANDOM(4) 排序

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

【问题讨论】:

  • 样本数据最好使用DDL + DML。请edit您的问题包括它,您当前的尝试和您想要的结果。更多详情,read this.
  • @Zohar Peled,我已经编辑了我的问题并提供了更多详细信息,包括所需的输出。你现在能帮忙吗。谢谢
  • 如果您正确发布示例数据,我可能会为您提供帮助......
  • 我添加并回答了,但是,它并没有直接回答你的问题。诀窍是在没有 TOP(1) 的情况下使用 NEWID()
  • 您好罗斯布什,感谢您的建议。我已经尝试过 NEWID(),它正在创建唯一的随机 id。但是我如何将它与案例 ID 联系起来?请指教。谢谢

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


【解决方案1】:

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

【讨论】:

  • 谢谢罗斯布什。非常感谢您的询问。我知道该怎么做,我会尝试的。再次感谢您的宝贵时间。
  • 嗨,我现在正在为这个查询的一件事而苦苦挣扎。该查询每月运行一次,并为每个团队成员分配随机案例。下个月再次运行时,不应分配相同的案例。直到 4 个月,不应分配相同的案例。您能否让我知道如何实现这一目标。谢谢。
  • 您有与用户分配案例的记录吗?
  • 我更新了对以前案例分配的检查,但是,如果没有更多案例编号,这将与用户不匹配,因此您可能想要检查 RN,但也能够找到那些由于您在上面评论的情况,不匹配。
  • 感谢罗斯布什的询问。有时我将相同的案例编号分配给不同的工人。我该如何避免呢?
猜你喜欢
  • 2012-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多