大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子
今天给大家带来的是 窗口函数的应用
因为需求希望我,提供脚本,直接上脚本
WITH t AS
(
SELECT 1 rn, 3.0 v FROM dual
UNION ALL SELECT 2, 4.5 FROM dual
UNION ALL SELECT 3, 6.0 FROM dual
UNION ALL SELECT 4, 11.0 FROM dual
UNION ALL SELECT 5, 3.0 FROM dual
)select * from t
有如上图所示的累积积分情况,现在如果消耗了11分,要从第一个开始清零得到如下
左边表示扣除的,右边表示使用的。
这样的需求,怎么实现呢?
我们现在来分析这个需求,首先看下rem_v 这个列,是个扣除后的剩余积分,
我们只需一个累加值,然后这个累加值和一个扣除的总积分相比较,如果积分累加值,小于这个要扣除的总分就变成0就行
如本次案例中,要扣除的总积分是11,累加值如下
这里的要扣除的是11 ,累加值是s ,如果s
如果s-v < x 那么就是求扣除积分后的变化的最后一行
那么就需要 s-x 这里的rn=3的行
否则就返回v
先忙是具体的SQL
第二个列跟第一个列思路相反就行
两个需求整理之后的 SQL
需求相对很复杂,这里解决的核心问题就是做的中间结果集,累加值,犹如辅助线,把问题都关联起来了!
剩下的就是根据数据,使用case when 语句做判断就行。
MySQL 8.0 开始 提供的窗口函数,为我们解决类似的问题,提供了很多方便。
在我之前写的系列文章中,也提供了窗口函数的具体使用方法和一些特殊的使用方法
如
SQL优化大神带你写有趣的SQL(9) 自定义变量的应用(2)
这篇讲了,能大量减少代码的window 函数。
谢谢大家~ 欢饮转发
我的微信公众号:SQL开发与优化(sqlturning)