2

我有两个表:[employee]并且[task]我想将task每个表中的 5 个任务分配employee到一个跟踪表中。分配需要是随机的,并且每个选择都应该排除那些已经选择的任务。

4

2 回答 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 回答