SQL Server 2012:如何随机将用户分配给两个指定OwnerId?
SQL Server 2012实现用户随机分配给指定所有者
在SQL Server 2012中,直接使用RAND()函数无法实现每行独立随机分配——因为RAND()在UPDATE语句中只会计算一次,所有符合条件的行都会被设置为同一个值。以下是两种可行的实现方案:
方案一:基于NEWID()的完全随机分配
利用NEWID()生成每行唯一的GUID,通过CHECKSUM()将其转换为整数后取模,随机选择目标OwnerId:
UPDATE Users SET OwnerId = CASE WHEN CHECKSUM(NEWID()) % 2 = 0 THEN 64 ELSE 72 END WHERE OwnerId = 37
说明
NEWID():每行都会生成一个唯一的GUID,确保每行的随机判断独立CHECKSUM(NEWID()):将GUID转换为整数,方便后续取模运算- 取模
%2会得到0或1两个结果,对应分配给64或72两个所有者,分配比例接近50%
方案二:均衡分配(尽量各分一半)
如果需要更均衡的分配比例,可先通过行号和总数判断,将随机排序后的用户平分为两组:
WITH UserCTE AS ( SELECT OwnerId, ROW_NUMBER() OVER (ORDER BY NEWID()) AS RowNum, COUNT(*) OVER () AS TotalCount FROM Users WHERE OwnerId = 37 ) UPDATE UserCTE SET OwnerId = CASE WHEN RowNum <= TotalCount / 2 THEN 64 ELSE 72 END
说明
- 先通过CTE给每个目标用户按随机顺序(
ORDER BY NEWID())生成行号,并统计总数量 - 前半部分行分配给64,后半部分分配给72,确保分配比例尽可能接近1:1
内容的提问来源于stack exchange,提问作者Jakxna360
相关产品推荐
相关产品推荐

