利用 SUM OVER 开窗函数实现累加计算
今天在坛子里发现一个很有意思的贴子: 点击打开链接
如上图所示,【需求数量】不变,【已满足数量】按照从序号大到小的顺序,从最小的【序号】中取值,使其等于【需求数量】
举个例子:比如物料号为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 开窗函数实现累加计算相关推荐
- oracle 中累加函数,CSS_oracle使用sum函数进行累加计算,====================Question============ - phpStudy...
oracle使用sum函数进行累加计算 ====================Question========================= jmbdat dayt y ...
- 利用分析函数和开窗函数进行分组查询
分析函数之分组排序 1.分析函数释义 row_number() OVER ( PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排 ...
- sum() over() 函数用于累加计算
本文主要讲的是计算一个指标时,需要按天累加,也就是累计指标计算,可以使用到该函数 1.可以按天进行累加 2.如果有相同的日期,可以先按天分组,然后进行累加,筛选项也是一样 数据源: 1.按照日期对应的 ...
- oracle 中累加函数,oracle使用sum函数进行累加计算
====================Question========================= jmbdat dayt y mon 27-9月 -07 2033.2 ...
- 大数据之Hive:Hive 开窗函数(二)
目录 前言 1.last_value开窗函数 2.lag开窗函数 3.lead开窗函数 4.cume_dist开窗函数 前言 书接上回,上回重点讲了聚合函数之count开窗函数,first_value ...
- mysql 开窗函数 累加_开窗函数在MySql中的使用
MySql在8.0的版本增加了对开窗函数的支持,终于可以在MySql使用开窗函数了.开窗函数又称OLAP函数(Online Analytical Processing).开窗函数的语法结构: #Key ...
- poi获取有效单元格个数_EXCEL利用SUM函数和FREQUENCY函数数组公式统计不同区间数据个数...
EXCEL函数公式大全之利用FREQUENCY函数数组公式统计不同区间数据个数.EXCEL函数与公式在工作中使用非常的频繁,会不会使用公式直接决定了我们的工作效率,今天我们来学习一下提高我们工作效率的 ...
- sum 开窗函数 oracle,oracle开窗函数案例详解
一.建表和数据准备 create table t_window( name varchar2(32), orderdate varchar2(32), cost varchar2(32) ) sele ...
- 开窗函数sum,avg,min,max用法
sum开窗函数 数据准备 hive> select * from TestData; OK cookie1 2021-04-10 1 cookie1 2021-04-11 5 cookie1 2 ...
最新文章
- android开发之svg全面总结
- [NOI2008]志愿者招募
- Harbor仓库的管理
- 数据结构与算法 / 贪心算法
- 团队项目第一阶段冲刺站立会议06
- MPLS服务合同到期了,是否该续签?
- 面对微信小程序的威胁,支付宝可以考虑安心做B2C的社交了
- Linux 命令(107)—— systemctl 命令
- xp升级windows7_微软大升级!Windows系统电脑将告别杀毒软件
- eclipse for php开发环境,eclipse for php 开发环境配置
- Glusterfs配置手册
- 百度编辑器ueditor获取不到内容?请把form放在table等其他元素最外面
- 开源项目推荐ruoyi
- vue 微信公众号 前端开发
- android ndk adk 旧版本下载
- 黑马培训python学费
- poppin_xpower_ 常城
- bootmgr is missing错误:首先检查系统分区是否为活动分区
- PRSice-2软件安装教程
- CSS控制多行文本省略--显示省略号