记一次业务场景下用到的递归(mysql、sqlserver)

公司主营酒店业务,最近我负责重构公司的酒店优惠券派发项目,相关业务场景如下:

优惠券表中每张优惠券的券ID都可能因为用户使用失败重发、用户申请延期、系统升级等等因素变更,券ID每次发生变更后会将前面那张旧券ID失效,然后将旧券ID记录在新券ID记录的一个字段中。

技术部同事只需满足他们的需求——记录下所有记录即可,但我们大数据部门的分析师需要追溯回第一次派发的首张券ID,用来统计券的真实使用情况。
如下图:
优惠券记录图示

我们需要找到第一行,新券ID为111的值,记录到每条记录的最后,期望做成下图:
期望优惠券记录图示

好,现在我们来看看怎么处理:
重构前的源库是 SQL Server,很自然地想到使用 with as 函数递归,特别地,sql server 的递归支持多元素递归,也就是可以根据结果集的每条记录进行递归,使用递归CTE(公用表表达式 Common Table Expression)稍作加工便能完全满足要求。

重构后的源库是 MySQL 5.7.4,递归CTE在 MySQL 8.0 版本以后才能被使用,而 8.0 以前的版本只支持使用变量递归,查了官方文档后(期间还google了各种方案),确定 mysql 的变量递归每次 sql 执行都只能支持一条记录递归,于是想到如下方案:

	1. 将每天的数据拆成小时运行,减少单次跑数的数据量;
	2. 将单次跑数的券ID做成临时表,加上标识字段;
	3. 将每个券ID做成变量,循环地一个个传参递归;

这种方法虽然很笨,但效果其实还挺好的。以后再在sql中看见递归就不怕啦 ^ ^ !

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值