sql - 将剩余值添加到 sql server 中的下一行
问题描述
我有如下表,其中包含该期间的客户用电量。可用数据如
OwnerID StartDate EndDate Volume
1 2019-01-01 2019-01-15 10.40
1 2019-01-16 2019-01-31 5.80
1 2019-02-01 2019-02-10 7.90
1 2019-02-11 2019-02-28 8.50
2 2019-03-01 2019-03-04 10.50
另一个表有其现有的剩余卷。两个表都与 Column OwnerID 连接
OwnerID ExistingVolume
1 0.90
2 0.60
现在添加(应用)具有当前交易量(第一个表)的 ExistingVolume 作为将新交易量计算为整数和剩余的十进制值添加到客户的下一个期间。
So expected result set should like,
OwnerId StartDate EndDate CalulatedVolume RemainingExistingVolume
1 2019-01-01 2019-01-15 11 0.30
1 2019-01-16 2019-01-31 6 0.10
1 2019-02-01 2019-02-10 8 0.00
1 2019-02-11 2019-02-28 8 0.50
2 2019-03-01 2019-03-04 11 0.10
不要四舍五入 CalulatedVolume。只需添加 table1.Volume + table2.ExistingVolume 即可获得整体。并且剩余的十进制值(从第一行开始)应该应用于下一行值 table1.Volume
你能建议如何在 SQL 查询中实现这一点吗?
解决方案
如果我理解正确,您希望从舍入中累积“错误”并将其应用于第二个表中的值。
您可以为此目的使用累积和 - 以及一些算术:
select t1.ownerid, t1.startdate, t1.enddate,
round(t1.volume, 0) as calculatedvolume,
( sum( t1.volume - round(t1.volume, 0) ) over (partition by t1.ownerid order by t1.startdate) +
t2.existingvolume
) as remainingexisting
from table1 t1 left join
table2 t2
on t1.ownerid = t2.ownerid;
您对舍入有非标准定义。这可以实现为ceil(x - 0.5)
。有了这个定义,代码是:
select t1.ownerid, t1.startdate, t1.enddate,
ceiling(t1.volume - 0.5) as calculatedvolume,
( sum( t1.volume - ceiling(t1.volume - 0.5) ) over (partition by t1.ownerid order by t1.startdate) +
t2.existingvolume
) as remainingexisting
from table1 t1 left join
table2 t2
on t1.ownerid = t2.ownerid;
这是一个 db<>fiddle。
推荐阅读
- javascript - ES6解构获取嵌套对象属性
- angularjs - 在某些条件匹配后如何检查视图中的 ng-repeat 是否为空
- azure-devops - 如何使用 azure-devops 将应用程序部署到特定的 ubuntu 服务器?
- database - 哪个数据库适合 React Native 应用程序?
- android - 在按钮文本中添加新行并增加按钮大小时如何不更改按钮的大小?
- xamarin - JniPeerMembers.AssertSelf (Java.Interop.IJavaPeerable self)
- spring-boot - 在 Jhipster Gateway 中增加上传到 API 的文件大小
- amazon-web-services - Amazon Lex 中的响应卡未显示
- laravel - 如何从 laravel eloquent 模型中的 api 访问授权用户?
- angular - 我想在角度 8 中双击调用函数