如何编写SQL查询获取累计总和的运行最大值?
解决方案
直接在原累计求和的基础上,套一层MAX()窗口函数即可实现需求,修改后的代码如下:
select ItemId, DateId, TargetRunningStock, -- 计算截至当前行的累计总和 sum(TargetRunningStock) over (partition by itemid order by dateid) as RunningTotal, -- 取截至当前行的累计总和最大值 max(sum(TargetRunningStock) over (partition by itemid order by dateid)) over (partition by itemid order by dateid rows between unbounded preceding and current row) as MaxRunningTotal from WarehouseData
逻辑说明
- 第一个窗口函数
sum(...)保留原逻辑,算出每行对应的累计总和(RunningTotal); - 第二个窗口函数
max(...)以相同的分区(ItemId)和排序(DateId)为范围,取从分区第一行到当前行的所有累计总和中的最大值,也就是你需要的「截至该行的累计总和最大值」。
如果你的SQL支持CTE(公共表表达式),可以把逻辑拆成两步,可读性更强:
with RunningTotals as ( select ItemId, DateId, TargetRunningStock, sum(TargetRunningStock) over (partition by itemid order by dateid) as RunningTotal from WarehouseData ) select ItemId, DateId, TargetRunningStock, RunningTotal, max(RunningTotal) over (partition by itemid order by dateid) as MaxRunningTotal from RunningTotals
这种写法先把累计求和的结果单独提取出来,再基于这个结果取最大值,逻辑更直观,也方便后续扩展。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

