sql - SQL - 将工作分配给工人 - 替代循环?
问题描述
在 SQL Server 2019 中,我有一个未分配任务表,以及另一个可用于处理这些任务的工作人员表。我的要求是通过使用将执行任务的工作人员更新表中的WorkerID
列来平均分配工作人员在可用任务上。Tasks
ID
- 每次运行 SQL 时,worker 的数量和任务的数量都可能不同。
- 任何一个表都可能比另一个表有更多的记录。
- 任务分配仅从 Workers 表中的第一个工作人员开始,并在任务全部分配完毕时结束。(为了公平起见,没有随机分配工人。)
- 任何一个表都可以有零记录。
给定具有以下结构的表,我想知道如何在不使用循环的情况下进行这些分配。我怀疑这可以通过使用行号、排名或其他一些类似的 SQL Server 魔法来完成,但我无法弄清楚。谢谢!
任务表:
JobID JobName WorkerID
------------------------------------
23 Carry Groceries NULL
1234 Drive NULL
6543 Dig NULL
234567 Walk NULL
78 Clean Room NULL
54 Cook Dinner NULL
2 Move Logs NULL
34 Cut Grass NULL
99 Milk Chickens NULL
工人表:
WorkerID WorkerName
---------------------
67 Larry
42 Sue
10 Peter
45 Steve
表的预期结果Tasks
:
JobID JobName WorkerID
--------------------------------------
23 Carry Groceries 67
1234 Drive 42
6543 Dig 10
234567 Walk 45
78 Clean Room 67
54 Cook Dinner 42
2 Move Logs 10
34 Cut Grass 45
99 Milk Chickens 67
解决方案
您可以使用窗口函数分配一个编号,然后join
。“循环”方法是:
with toupdate as (
select t.*, row_number() over (order by (select null)) as seqnum
from tasks t
)
update toupdate
from toupdate join
(select w.*,
row_number() over (order by (select null)) as seqnum,
count(*) over () as cnt
from workers w
) w
on w.seqnum = ( (toupdate.seqnum - 1) % w.cnt) + 1;
推荐阅读
- python - 可视化编程:在 GUI 中反映代码的变化
- javascript - Javascript / Json / Firestore 代码到 Firestore 批量上传
- jquery - json数据在其他函数中返回
- php - 使用 PHP 上传更大的文件失败
- python - 如何使用 Dash HTML 组件显示 html 文件
- machine-learning - Google Cloud Platform 加载 2G 数据集收费 10 美元
- sql - 无法访问数据库
- linux - 只获取不断轮询的 shell 命令的一个值
- node.js - 正文解析器在快速路由器中记录空对象
- ruby-on-rails - Rails Active Storage "attach" ArgumentError(参数数量错误(给定 0,预期为 1)):