sql - 更新来自其他表的表值,如分布
问题描述
我有一个table 1
我必须从其他桌子上分发奖励的地方,table 2
但以先发球的方式从其他桌子行开始。
Table 1
ATTIME | Absent | LeaveType
-----------------------------
2019-01-01| 1 |
2019-01-02| 1 |
2019-01-03| 1 |
2019-01-04| 1 |
2019-01-05| 1 |
2019-01-06| 1 |
Table 2
LeaveType | Total
-------------------
Casual | 3
Sick | 2
我已经通过使用游标实现了它,但是想要一个设置基本UPDATE QUERY或任何其他优化我的执行计划的选项,
最终结果将是......
Table 1
ATTIME | Absent | LeaveType
-----------------------------
2019-01-01| 1 | CL
2019-01-02| 1 | CL
2019-01-03| 1 | CL
2019-01-04| 1 | SL
2019-01-05| 1 | SL
2019-01-06| 1 |
解决方案
在受支持的 SQL Server 版本中,您将使用累积和row_number()
:
with toupdate as (
select t1.*,
row_number() over (order by attime) as seqnum
from table1 t1
)
update toupdate
set leavetype = t2.leavetype
from (select t2.*,
sum(total) over (order by leavetype) as runningtotal
from table2 t2
) t2
where toupdate.seqnum between t2.runningtotal + 1 - total and t2.runningtotal;
在旧的、不受支持的 SQL Server 版本中,累积总和更加麻烦。一种方法使用相关子查询:
with toupdate as (
select t1.*,
row_number() over (order by attime) as seqnum
from table1 t1
)
update toupdate
set leavetype = t2.leavetype
from (select t2.*,
(select sum(total)
from table2 tt2
where tt2.leavetype <= t2.leavetype
) as runningtotal
from table2 t2
) t2
where t1.seqnum between t2.runningtotal + 1 - total and t2.runningtotal;
推荐阅读
- python - 使用列标题和行值创建新列
- cs50 - 每个 if 公式的输出,CS50 问题集学分
- javascript - 如何将 jQuery 功能与分组元素分组?
- python - Django:通过列表过滤器获取查询集(填充和/或空)
- r - Rcpp 和 boost:它应该可以工作,但不能
- c# - 如何将 ushort 16 位数组转换为图像 C#
- node.js - 带有 Node JS、Express、Heroku 的 Websocket:添加路由会中断 Web 套接字连接
- html - Safari 不支持媒体查询:显示:要显示的表格单元格:块
- apache-kafka - ulimit、lsof、cat /proc/sys/fs/file-max 的区别
- mysql - 无法插入显示外键约束的数据失败错误 1452