mysql8 窗口函数_实战 MySQL8.0 窗口函数的巧妙应用

大家好,我是知数堂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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值