我有两个表:[employee]并且[task]我想将task每个表中的 5 个任务分配employee到一个跟踪表中。分配需要是随机的,并且每个选择都应该排除那些已经选择的任务。
2 回答
0
在这篇文章中:以随机顺序返回行由 Robert Harvey 在评论中链接,您可以找到关于执行涉及ORDER BY NewID()甚至ORDER BY Rand().
以我的经验,完成您想要做的事情的最佳方法是引入一个新的索引列,例如RandomColumn,用随机数(使用)填充Rand()一次,然后每次您希望随机行选择一个随机数,例如R,并选择如下:
... WHERE RandomColumn >= R ORDER BY RandomColumn.
于 2018-12-28T20:38:10.460 回答
0
我想我找到了一种优雅的方式来实现你想要的。唯一的问题是,如果您的任务少于 5 x 员工,则某些员工将根本没有分配任何任务。
WITH Employee AS (SELECT ROW_NUMBER() OVER(ORDER BY NewID()) AS ID, * FROM Employee),
Task AS (SELECT ROW_NUMBER() OVER(ORDER BY NewID()) AS ID, * FROM Task)
SELECT *
FROM Employee
LEFT JOIN Task
ON Employee.ID = FLOOR((Task.ID-1)/5)+1
您可以将所需的结果插入到跟踪表中
根据您的评论,添加以确保任务按比例分配,如果任务 > 5 x 员工可能会发生问题,系统将为某些员工分配更多任务:
WITH Employee AS (SELECT ROW_NUMBER() OVER(ORDER BY NewID()) AS ID, * FROM Employee),
Task AS (SELECT ROW_NUMBER() OVER(ORDER BY NewID()) AS ID, * FROM Task)
SELECT *
FROM Employee
LEFT JOIN Task
ON Employee.ID = FLOOR((Task.ID-1) %
(SELECT COUNT(*) FROM Employee)
)+1
它使用模数 % 运算符来获得整数除法的其余部分,因此,它为每个任务提供相关数字,当达到员工总数时,从 1 重新开始。
于 2018-12-28T08:33:34.847 回答