【实例】AI将一组50条数据随机且平均地分配给五个人,WorkFine内实现-综合交流区论坛-低代码平台-本牛千智|专注WorkFine

【实例】AI将一组50条数据随机且平均地分配给五个人,WorkFine内实现

通过AI我们可以快速得到解题方法和思路,另外我们还需要在WorkFine设计器支持哪些函数,才能更高效的在WorkFine内开发

AI回复

要将一组50条数据随机且平均地分配给五个人,你可以使用 SQL 的窗口函数、RAND() 函数(或类似的随机函数)以及一些额外的逻辑来实现。这里假设你有一个表 tasks 包含这些数据,并且表中有一个唯一标识每条记录的字段,比如 id

以下是一个可能的解决方案步骤:

  1. 为每条记录生成一个随机数
  2. 根据随机数对记录进行排序
  3. 使用窗口函数计算一个行号
  4. 根据行号确定每个人应该获得哪些记录

首先,我们需要创建一个临时表或视图,其中包含原始数据和一个随机数。然后我们可以用这个随机数来分配任务。

步骤 1: 创建一个包含随机数的视图

CREATE VIEW tasks_with_random AS
SELECT id, task_description, RAND() AS random_number
FROM tasks;

步骤 2: 分配任务

接下来,我们可以通过对随机数排序并使用窗口函数 ROW_NUMBER() 来分配任务。我们将任务按照随机数排序,并为每条记录分配一个行号,然后基于行号来决定任务属于哪个人。

WITH RankedTasks AS (
    SELECT id, task_description, ROW_NUMBER() OVER (ORDER BY random_number) AS row_num
    FROM tasks_with_random
)
SELECT 
    id,
    task_description,
    CASE
        WHEN row_num BETWEEN 1 AND 10 THEN 'Person A'
        WHEN row_num BETWEEN 11 AND 20 THEN 'Person B'
        WHEN row_num BETWEEN 21 AND 30 THEN 'Person C'
        WHEN row_num BETWEEN 31 AND 40 THEN 'Person D'
        WHEN row_num BETWEEN 41 AND 50 THEN 'Person E'
    END AS assigned_to
FROM RankedTasks
ORDER BY assigned_to, row_num;

上述 SQL 代码首先通过 ROW_NUMBER() 函数为每个任务分配了一个唯一的行号。然后它使用 CASE 语句来根据行号确定每个任务应该分给谁。每个区间包含10个任务,确保了任务被均匀分配。

请注意,不同的数据库系统可能有不同的语法。例如,RAND() 函数在 MySQL 中可用,而在 PostgreSQL 中则需要使用 RANDOM()。同样,某些数据库系统可能不支持 CREATE VIEW 时直接使用随机数函数。在这种情况下,你可以在查询中直接使用随机数函数。

如果你希望在一个事务中完成这些操作并且更新原始表,你还需要添加适当的更新语句。但是,通常这种类型的分配更适合在一个批处理脚本中执行,或者作为一个独立的过程来进行。


如果你想确保剩余的数据也被平均分配给各个组,那么可以采用以下方法:

假设你有4个人(A、B、C、D)来分配任务,并且总共有50个任务。前40个任务可以均匀分配给每个人10个,剩下的10个任务也需要被尽可能平均地分配。

以下是具体的步骤:

SQL 示例

步骤 1: 创建视图,为每条记录生成一个随机数

CREATE VIEW tasks_with_random AS
SELECT id, task_description, RAND() AS random_number
FROM tasks;

步骤 2: 将所有任务按随机顺序排序并进行初步分配

WITH RankedTasks AS (
    SELECT id, task_description, ROW_NUMBER() OVER (ORDER BY random_number) AS row_num
    FROM tasks_with_random
)
SELECT id, task_description, row_num,
       CASE
           WHEN row_num BETWEEN 1 AND 10 THEN 'Person A'
           WHEN row_num BETWEEN 11 AND 20 THEN 'Person B'
           WHEN row_num BETWEEN 21 AND 30 THEN 'Person C'
           WHEN row_num BETWEEN 31 AND 40 THEN 'Person D'
           ELSE NULL -- This will be for rows 41 to 50
       END AS assigned_to
INTO temp_tasks
FROM RankedTasks;

步骤 3: 随机分配剩余的任务

为了平均分配剩余的任务,我们可以使用模运算(MOD)来循环地分配任务。我们首先确定剩余的任务数量以及每个组需要额外获得多少任务。

假设剩余任务的数量为 N,则每个组应该获得 N / 4 个任务,如果有余数,则从第一个组开始分配剩余的任务。

WITH RemainingTasks AS (
    SELECT id, task_description, row_num
    FROM temp_tasks
    WHERE assigned_to IS NULL
),
AdditionalAssignments AS (
    SELECT id, task_description, row_num,
           CASE
               WHEN MOD(row_num - 40, 4) = 0 THEN 'Person A'
               WHEN MOD(row_num - 40, 4) = 1 THEN 'Person B'
               WHEN MOD(row_num - 40, 4) = 2 THEN 'Person C'
               WHEN MOD(row_num - 40, 4) = 3 THEN 'Person D'
           END AS additional_assigned_to
    FROM RemainingTasks
)
SELECT t.id, t.task_description, t.assigned_to,
       CASE WHEN t.assigned_to IS NOT NULL THEN t.assigned_to ELSE a.additional_assigned_to END AS final_assigned_to
FROM temp_tasks t
LEFT JOIN AdditionalAssignments a ON t.id = a.id;

在上面的示例中:

  • 我们首先选择了所有未分配的任务 (RemainingTasks CTE)。
  • 然后我们创建了一个新的 CTE (AdditionalAssignments),其中使用模运算来分配剩余的任务。从第41行开始,每4行分别分配给A、B、C、D。
  • 最后,我们将原始的任务表与额外分配的任务表连接起来,并更新那些未分配的任务的分配状态。

这种方法保证了每个组都有相同数量的任务,如果有剩余任务,也会尽可能平均地分配给各组。

请注意,这个例子假定你已经有一个包含50个任务的tasks表,并且每个任务都有一个唯一的id。你需要根据你的实际情况来调整这个例子。

实例效果

编辑数据行然后点全部分配-回写,仅展示实现原理

公共账套

本案例来源于公共账套:202407->随机分配问题模板

相关文章

请登录后发表评论

    请登录后查看回复内容