今天在坛子里发现一个很有意思的贴子: 点击打开链接

如上图所示,【需求数量】不变,【已满足数量】按照从序号大到小的顺序,从最小的【序号】中取值,使其等于【需求数量】
举个例子:比如物料号为1的,有三条记录:分别是序号1、3、4,序号4的【已满足数量】比【需求数量】少了1,则从序号1【已满足数量】中取出1 给序号4,序号1的【已满足数量】变为11,序号4的【已满足数量】变为5;
2、序号3的【已满足数量】比【需求数量】少了6,则从序号1【已满足数量】中取出6 给序号3,序号1的【已满足数量】变为5,序号3的【已满足数量】变为30;
3、按照这个规则一直循环下去,直到序号大的物料的【已满足数量】全部等于【需求数量】。
结果如下图所示

我的答案如下(注:必须SQL Server2012+ 才能使用):

USE tempdb
GO
IF OBJECT_ID('test') IS NOT NULL DROP TABLE test
CREATE TABLE test([序号] INT primary key, [物料号] int,[需求数量] int,[已满足数量] int)
INSERT INTO test([序号],[物料号],[需求数量],[已满足数量])
SELECT  1,1,20,12
union SELECT  2,2,26,7
union SELECT  3,1,30,24
union SELECT  4,1,5,4
union SELECT  5,2,4,4
union SELECT  6,2,9,5
--union SELECT  7,2,9,1;with cte as (
SELECT *
,SUM([已满足数量]) OVER(PARTITION BY [物料号]) as okSum --
,SUM([需求数量]) OVER(PARTITION BY [物料号] order BY [序号] desc) as needSum2
FROM test
),cte2 as (select ROW_NUMBER() over(partition by [物料号] order by [序号] desc) as rid,* from cte
),cte3 as(
select *
,CASE when okSum>=needSum2 then [需求数量]
else okSum-(select needSum2 from cte2 as b where a.[物料号]=b.[物料号] and b.rid=a.rid-1) end as [已满足数量2]
from cte2 as a
)
select *,case when [已满足数量2]>0 then [已满足数量2]  else 0 end as [已满足数量3]
from cte3

--完全按题目的数据来的执行结果, 已满足数量3 即为所求:

--增加了一行数据 序号为7 的, 主要是测试在数量不够分配时的情况结果是否正常:

msdn 参考链接: 点击打开链接

利用 SUM OVER 开窗函数实现累加计算相关推荐

  1. oracle 中累加函数,CSS_oracle使用sum函数进行累加计算,====================Question============ - phpStudy...

    oracle使用sum函数进行累加计算 ====================Question========================= jmbdat    dayt    y       ...

  2. 利用分析函数和开窗函数进行分组查询

    分析函数之分组排序 1.分析函数释义     row_number() OVER ( PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排 ...

  3. sum() over() 函数用于累加计算

    本文主要讲的是计算一个指标时,需要按天累加,也就是累计指标计算,可以使用到该函数 1.可以按天进行累加 2.如果有相同的日期,可以先按天分组,然后进行累加,筛选项也是一样 数据源: 1.按照日期对应的 ...

  4. oracle 中累加函数,oracle使用sum函数进行累加计算

    ====================Question========================= jmbdat    dayt    y       mon 27-9月 -07 2033.2 ...

  5. 大数据之Hive:Hive 开窗函数(二)

    目录 前言 1.last_value开窗函数 2.lag开窗函数 3.lead开窗函数 4.cume_dist开窗函数 前言 书接上回,上回重点讲了聚合函数之count开窗函数,first_value ...

  6. mysql 开窗函数 累加_开窗函数在MySql中的使用

    MySql在8.0的版本增加了对开窗函数的支持,终于可以在MySql使用开窗函数了.开窗函数又称OLAP函数(Online Analytical Processing).开窗函数的语法结构: #Key ...

  7. poi获取有效单元格个数_EXCEL利用SUM函数和FREQUENCY函数数组公式统计不同区间数据个数...

    EXCEL函数公式大全之利用FREQUENCY函数数组公式统计不同区间数据个数.EXCEL函数与公式在工作中使用非常的频繁,会不会使用公式直接决定了我们的工作效率,今天我们来学习一下提高我们工作效率的 ...

  8. sum 开窗函数 oracle,oracle开窗函数案例详解

    一.建表和数据准备 create table t_window( name varchar2(32), orderdate varchar2(32), cost varchar2(32) ) sele ...

  9. 开窗函数sum,avg,min,max用法

    sum开窗函数 数据准备 hive> select * from TestData; OK cookie1 2021-04-10 1 cookie1 2021-04-11 5 cookie1 2 ...

最新文章

  1. android开发之svg全面总结
  2. [NOI2008]志愿者招募
  3. Harbor仓库的管理
  4. 数据结构与算法 / 贪心算法
  5. 团队项目第一阶段冲刺站立会议06
  6. MPLS服务合同到期了,是否该续签?
  7. 面对微信小程序的威胁,支付宝可以考虑安心做B2C的社交了
  8. Linux 命令(107)—— systemctl 命令
  9. xp升级windows7_微软大升级!Windows系统电脑将告别杀毒软件
  10. eclipse for php开发环境,eclipse for php 开发环境配置
  11. Glusterfs配置手册
  12. 百度编辑器ueditor获取不到内容?请把form放在table等其他元素最外面
  13. 开源项目推荐ruoyi
  14. vue 微信公众号 前端开发
  15. android ndk adk 旧版本下载
  16. 黑马培训python学费
  17. poppin_xpower_ 常城
  18. bootmgr is missing错误:首先检查系统分区是否为活动分区
  19. PRSice-2软件安装教程
  20. CSS控制多行文本省略--显示省略号

热门文章

  1. 清除U盘内所占的隐藏空间
  2. 双十一提前盘点 这些必入的科大讯飞AI生产力好物
  3. 3D目标检测(二)—— 直接处理点云的3D目标检测网络VoteNet、H3DNet
  4. 智能语音识别技术入门系列(上)
  5. 泊车机器人控制系统组成
  6. 黄金周北京住宅交易量大增
  7. Redis学习笔记(面试+实战)
  8. JAVA毕业设计汇美食电子商城计算机源码+lw文档+系统+调试部署+数据库
  9. 内容无错误,但运行不出来
  10. 简单且灵敏的氨基酸检测试剂盒简介